【问题标题】:Seg Fault when allocating memory and setting values to 3D array向 3D 数组分配内存和设置值时出现 Seg Fault
【发布时间】:2020-05-12 14:37:30
【问题描述】:

我想创建一个包含 26 个单词数组的数组(按第一个字母对单词列表进行排序),所以我相信我相应地分配了内存,但是当我尝试测试运行并尝试设置一个随机单词“hi”时,对于每个必须有单词的位置,它只适用于前 5 个字母,然后返回一个设置错误。请原谅我的代码或描述,我是初学者。帮助

注意:我的两个参数都是在外部函数中定义的,wordArray 是给定文本文件中的单词数组,numWordsPerLetter 是一个整数数组,其中包含以字母表中每个字母开头的单词数。

char*** create_alphabetical_array(char** wordArray, int* numWordsPerLetter){

  char*** alphabeticalArrays;
  int i, j;

  alphabeticalArrays = malloc(sizeof(char**)*26);
  for (i = 0; i < 26; i++){
    printf("%d\n", numWordsPerLetter[i]+1);
    alphabeticalArrays[i] = malloc(sizeof(char*)*numWordsPerLetter[i]+1);
  }

  for (i = 0; i < 26; i++){
    for (j = 0; j < (numWordsPerLetter[i]+1); j++){
      printf("%d %d %d\n", i, j, numWordsPerLetter[i]+1); /* using to help debug */
      strcpy(alphabeticalArrays[i][j], "hi");
    }
  }

  return (alphabeticalArrays);
}

【问题讨论】:

  • malloc(26) 应该是malloc(26 * sizeof(char**))。
  • 至于你的问题,不要忘记提供给malloc的大小是以字节为单位的大小,而不是抽象的“元素”。
  • @Blaze 我以前有过,但在第二次 for 循环的第一次迭代后它给了我一个段错误,这种方式仍然让我在段错误之前完成 5 次迭代
  • 您似乎在最后一个维度上忘记了malloc
  • 关于:char*** alphabeticalArrays; 和类似声明:请阅读three star programmer

标签: c arrays segmentation-fault malloc strcpy


【解决方案1】:

至少有这两个错误:

错误的元素大小和错误的n。 alphabeticalArrays[i] 是 char **,所以 sizeof(int) 是错误的。 element_size * numWordsPerLetter[i]+1 应该是 element_size * (numWordsPerLetter[i]+1)

最好使用p = malloc(sizeof *p * n),然后是p = malloc(sizeof *(type-of p) * n)。更容易正确编码、审查和维护。

// alphabeticalArrays[i] = malloc(sizeof(int)*numWordsPerLetter[i]+1);
alphabeticalArrays[i] = malloc(sizeof alphabeticalArrays[i][0] * (numWordsPerLetter[i]+1));
//                             ^---Element size--------------^   ^-------------N--------^    

strcpy(alphabeticalArrays[i][j], "hi"); 失败,因为 alphabeticalArrays[i][j] 未分配指向 字符串 "hi" 的已分配内存的指针。 @Zelnes

alphabeticalArrays[i][j] = malloc(strlen("hi") + 1);

替代方案:研究strdup()。


健壮的代码还会检查分配是否成功。

p = malloc(n);
if (p == NULL) Handle_Failure();

【讨论】:

  • @NathanDrake 注意“至少这个错误:”。更改“有效”,只是代码有其他问题。
  • 我尝试使用您推荐的格式解决第一个问题,您认为合适吗?因为我希望为每个字母数组(arr[0]、arr[1])的字符数组(arr[0][0]、arr[0][1] 等)分配足够的内存,如int 数组参数
  • @NathanDrake 是的。也可以考虑alphabeticalArrays = malloc(sizeof(char**)*26); --> alphabeticalArrays = malloc(sizeof *alphabeticalArrays * 26);。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2018-06-30
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多