【发布时间】:2020-04-21 23:19:17
【问题描述】:
int **elem;
elem = (int **)malloc(sizeof(int**) * numCol);
for (i = 0; i < 2; i++)
for (j = 0; j < numCol; j++)
{
scanf("%d", &elem[i][j]); //Shouldn't it give a value to the address pointed by
//a pointer to pointer to int?
}
为什么这段代码会给出分段错误错误?(分段错误:11) 这段代码有效:
int **elem;
elem = (int **)malloc(sizeof(int**) * numCol);
for (i = 0; i < 2; i++)
{
elem[i] = (int *)malloc(numCol * sizeof(int));
// Fill it with values
for (j = 0; j < numCol; j++)
{
scanf("%d", &elem[i][j]);
}
我很困惑。除了分割问题之外, int ** 的值不是 4 吗?为什么不直接使用 int。
【问题讨论】:
-
int *和int **很可能具有相同的大小,但你真的应该写elem = malloc( numCol * sizeof *elem )或elem = malloc( numCol * sizeof(int *))。我更喜欢前者,因为它很好地避免了这个特殊的错误。请注意,强制转换是不必要的,并且可能存在问题。 -
许多编程错误是由于假设指针具有与整数相同的大小,还有许多其他错误是因为假设大小为 4。也许在您的机器上
sizeof (int) == sizeof (int *) == 4,但是在所有机器上肯定不是这样。
标签: c matrix scanf dynamic-memory-allocation