【问题标题】:c pointer array segfault errorc指针数组段错误
【发布时间】:2013-04-07 20:46:19
【问题描述】:

我是指针新手,所以我有点问题。我有一个简单的程序来打印 0-100 之间的随机 int 值。但它只打印第一个值,然后我得到一个分段错误(核心转储)

#include <stdio.h>
#include <stdlib.h>

void printArray(int **array, int size) 
{
  int i;
  for (i=0; i<size; i++)
  {
    printf("index[%d] = %i \n",i,*array[i]);
  }
}

int main() 
{   
  int size = 10;
  int *array = (int *) malloc (sizeof(size));
  int i;
  for (i=0; i<size; i++) 
  {
    array[i] = rand() % 100 + 1;
  }

  printArray(&array,size);
  free(array);

  return 0;

}

我真的不知道为什么,任何帮助。谢谢:)

【问题讨论】:

  • 我不建议转换malloc的结果。
  • 错误 -> int *array = (int *) malloc (sizeof(size)); 正确 -> int *array = malloc (sizeof(*array * size));
  • 一点建议:除非您打算更改指针本身,否则您应该只传递指针本身而不是指向它的指针。这样一来,您就省去了&amp; 和两个*(还有一些混乱)

标签: c pointers


【解决方案1】:

您看到了运算符优先级的影响。 operator[]operator* 之前。因此,您需要将其放在括号中:

printf("index[%d] = %i \n",i,(*array)[i]);

事实上,它需要索引 0,您的数组,并取消引用指针以获取第一个元素,然后移动到下一个数组(它不存在),取消引用该指针,然后 BOOM!未定义的行为。

荣誉归 onon15 为第一,但您的数组实际上并不是一个数组。它是单个元素(因为sizeof(size) 恰好与此处的sizeof(*array) 相同)。你想要这样的东西:

int *array = malloc(sizeof(int) * size); 

【讨论】:

  • @EdS.,所以我现在注意到了:p
  • @EdS.,有趣的是,尽管如此,第一个输出(如果仅访问该输出)的打印行为仍然是明确定义的。无论哪种方式,它都可以访问第一个数字,然后就搞砸了。另外,天哪,我发誓新的答案首先出现了,但时代已经说明了一切。
  • 是的,还有一个空间(尽管在printArray 之前已经在循环中调用了UB。是的,他的回答是第一个,我在发表评论后查看了时间。
  • @EdS.,今天搞砸了我的大脑。我想更多的时间以前意味着以后。别难过,你还有未播的malloc :p
  • 嗯,每个人都有权偶尔有一次精神上的昙花一现。 19 岁时,您是该网站上最聪明、知识最渊博的成员之一。如果您正在寻找 SD 的工作,请告诉我:D
【解决方案2】:
int *array = (int *) malloc (sizeof(size));

大小是整数。所以 sizeof(size) 是一个整数的大小,而不是 10 个整数的数组。你可能打算这样做

int *array = (int *) malloc (size * sizeof(int));

或者更好,

int *array = (int *) calloc(size, sizeof(int));

【讨论】:

  • 好收获。我没看到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2018-07-29
  • 2013-09-18
相关资源
最近更新 更多