繁体   English   中英

为 3D 数组分配内存和设置值时出现段错误

[英]Seg Fault when allocating memory and setting values to 3D array

我想创建一个包含 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);
}

至少有这两个错误:

错误的元素大小和错误的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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM