【问题标题】:Dynamic array with malloc doesn't work but fixed size does - C具有 malloc 的动态数组不起作用,但固定大小可以 - C
【发布时间】:2014-05-25 01:06:39
【问题描述】:

为什么固定数组可以工作,但是当我尝试使用 malloc 使其成为动态数组时,会出现分段错误?除了 *10 之外,我尝试了各种值。这只是使用一个小文件。我需要它来处理包含 90,000 个单词的字典。

FILE *fp;
long lSize;
//char buffer[100];
char *buffer=malloc(sizeof(char)*10);
int i = 0;

fp = fopen ( "cats.txt" , "rb" );
if( !fp ) perror("cats.txt"),exit(1);

wordTree = makeEmptyTree();

while( fscanf(fp, "%s", &buffer) != EOF )
{
    addStringToTree(wordTree, buffer);
    //printf("%s\n", words[i]);
}

fclose(fp);
//free(buffer);

如果需要,我也可以包含 addStringToTree。

编辑 1

感谢修复它的人。不幸的是,我无法让 90,000 字的文本文件工作,仍然出现 seg 错误错误。

【问题讨论】:

  • 关于编辑。使缓冲区足够大。如果问题仍然存在,请确保 wordTree 一切正常。尝试使用调试器,例如 gdb。

标签: c dynamic segmentation-fault malloc coredump


【解决方案1】:

改变

char *buffer=malloc(sizeof(char)*10);

char *buffer=malloc(100);

while( fscanf(fp, "%s", &buffer) != EOF )

while( fscanf(fp, "%s", buffer) != EOF )

然后再试一次。

  1. sizeof(char) 总是返回 1,buffer 的大小应该是 100(因为在静态情况下它是 100);
  2. buffer 已经是指向char 的指针,& 在没有必要之前将给出指针的地址而不是buffer 指向的地址。 (这可能是段错误的原因。)

【讨论】:

    【解决方案2】:

    应该是

    fscanf(fp, "%s", buffer) //remove the ampersand
    

    【讨论】:

      【解决方案3】:

      您正在 fscanf 中传递指向指针的指针。只需在 fscanf 中有缓冲区。在 'char buffer[]' 的情况下,&buffer 和 buffer 是等价的。因此在这种情况下没有段错误。

      【讨论】:

      • 它们不是等价的,但在常见的实现上它仍然有效。
      【解决方案4】:

      注意你的固定数组和动态分配数组的类型是不同的:

      char buffer[100];
      

      对比

      char* buffer 
      

      Malloc 返回您动态分配的内存的地址位置,因此您不需要在它前面加上'&'。所以只需使用这个:

      while( fscanf(fp, "%s", buffer) != EOF )
      {
          .....
      

      【讨论】:

        猜你喜欢
        • 2014-11-15
        • 2017-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多