gpt4 book ai didi

使用指针比较 c 中矩阵的元素

转载 作者:行者123 更新时间:2023-11-30 21:17:04 25 4
gpt4 key购买 nike

有人知道为什么当我想将矩阵的元素与 0 进行比较时 Visual Studio 会抛出异常吗?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define DIM 100

void citire(int **a, int n);
int negNumbers(int **a, int n);

void main(void)
{
int *a, n,nn;
printf("n = ");
scanf("%d", &n);
citire(&a, n);

nn = negNumbers(&a, n);
printf("\nThe negative numbers are : %d", nn);
_getch();
}

void citire(int **a, int n)
{
*a = (int *)malloc(sizeof(int)*n*n);
for (int i = 0; i < n*n; i++)
scanf("%d", *a+i);

}

int negNumbers(int **a, int n)
{
int k = 0;
*a = (int *)malloc(sizeof(int)*n*n);
for (int i = 0; i < n-1; i++)
for (int j = i; j < n; j++)
{
if (*(*(a + i) + j) < 0)
k++;
}
return k;

}

这就是全部代码。它引发了我这个异常:

0xC0000005: Access violation reading location 0xCCCCCCD0.

我必须提到,如果我使用调试器,结果是好的。

最佳答案

正如评论中指出的那样:

if (*(*(a + i) + j) < 0)

访问完全没有意义。它与 *a 的实际内容完全不匹配(它是指向 n * n 整数的单个指针)。

应该是:

(*a)[i * n + j]

或者为了清楚起见,在内部取消双星指针,而在访问函数内部时只使用本地指针:

int * const base = malloc(n * n * sizeof *base);

我会这样写。

然后像这样访问:

base[i * n + j] = ...

当然不要忘记最后将其导出给调用者:

*a = base;

此外,由于所有内存都未直接从 malloc() 初始化,因此该代码......没有任何意义。

关于使用指针比较 c 中矩阵的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47816514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com