在C中动态分配结构

时间:2014-03-28 10:33:22

标签: c realloc

我在“新闻”结构中有一个char *,如下所示:

typedef struct news{
        char *name;
}news;

我从文件中读取了一些文本(例如我有同样的行:你好)。对于main和我的函数,我编写了这段代码:

int insert(news **note, char *text,int i);

int main(){
   news *note;
   int i=0,j;
   note = malloc(sizeof(news));

   for (j=0;j<5;j++){
          i=insert(&not,"hello",i);
          printf("%s\n",note[i-1].name);
   }
   system("pause");
}

int insert(news **note, char *text,int i){
    (*note)[i].name = malloc(strlen(text)*sizeof(char));
    strcpy((*note)[i].name,text);
    note = realloc((*note),++i*sizeof(news));
    return i;
}

为什么j>2会出现细分错误?有什么问题?

3 个答案:

答案 0 :(得分:3)

您的分配存在问题。

而不是

not = realloc((*note),++i*sizeof(news));

使用

*note = realloc((*note),(++i + 1) * sizeof(news));

这有效吗?


修改

还要更改 @Michael Walz 在评论中所说的内容

结果是:

int insert(news **note, char *text,int i);

int main(){
   news *note = NULL;
   int i = 0;
   int j = 0;

   if ((note = malloc(sizeof(news))) == NULL) {
     return (-1);
   }

   for (j = 0; j < 5; ++j){
       i = insert(&note, "hello", i);

       printf("%s\n", note[i - 1].name);
   }

   system("pause");
}

int insert(news **note, char *text, int i) {
    (*note)[i].name = strdup(text);

    *note = realloc((*note), (++i + 1) * sizeof(news));

    return i;
}

答案 1 :(得分:1)

问题可能就在这里:

note = realloc((*note),++i*sizeof(news));

您正在重新分配静态指针,因为notenews**

所以使用

*note = realloc((*note),(++i + 1)*sizeof(news));

感谢RaNdoM_PoWneD

答案 2 :(得分:1)

RaNdoM_PoWneD提供了技术上正确的答案。

但你的代码并不好。这就是你遇到这个麻烦的原因。

  1. 你为什么要传指针指针?
  2. 主要for循环中j的目的是什么?
  3. 如果你打算做printf之类的事情,你需要做 当/0成员malloc.name的空间。更好的是,因为你正在动态分配它;将另一个.name大小的成员添加到news结构。
  4. 在对OP的评论中接受DevSolar的建议。

  5. #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct news
    {
        size_t size;
        char *name;
    }
    news;
    
    
    news* insert(news *note, char *text, int i)
    {
        //NB: if note is NULL realloc acts like malloc
        news* new_note=(news*)realloc(note, (i+1)*sizeof(news));
        if (new_note)
        {
            size_t size=strlen(text)*sizeof(char);
            new_note[i].size=size;
            new_note[i].name = malloc(size +1); //make room for /0
            strcpy(new_note[i].name,text); //copies trailing /0 as well
        }
        return (new_note);
    }
    
    int main()
    {
        news *note=NULL;
        int j,k;
    
        for (j=0;j<5;j++)
        {
            news* new_note=insert(note,"hello",j);
            if (new_note)
            {
                note=new_note;
                printf("%s\n",note[j].name);
            }
            else //bork
                break;
       }
    
    
       //don't forget to free your allocations !
        for (k=0;k<j;k++)
            free(note[k].name);
        free(note);
    
       return 0;
    }
    

    http://ideone.com/DCmYpU

      

    调试的难度是首先编写代码的两倍。   因此,如果您尽可能巧妙地编写代码,那么您就是   定义,不够聪明,无法调试它。   的   
       Brian Kernighan