C中结构的动态分配

C中结构的动态分配,c,realloc,C,Realloc,我在“news”结构中有一个char*,如下所示: typedef struct news{ char *name; }news; 我从一个文件中读到一些文本(在示例中,我曾经读过同一行:hello)。对于main和my函数,我编写了以下代码: int insert(news **note, char *text,int i); int main(){ news *note; int i=0,j; note = malloc(sizeof(news));

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

typedef struct news{
        char *name;
}news;
我从一个文件中读到一些文本(在示例中,我曾经读过同一行:hello)。对于main和my函数,我编写了以下代码:

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;
}
int插入(新闻**注释,字符*文本,int i);
int main(){
新闻*注;
int i=0,j;
注=malloc(sizeof(新闻));

对于(j=0;j2
?有什么问题?

您的分配有问题

而不是

not = realloc((*note),++i*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;
}
int插入(新闻**注释,字符*文本,int i);
int main(){
news*note=NULL;
int i=0;
int j=0;
if((note=malloc(sizeof(news)))==NULL){
返回(-1);
}
对于(j=0;j<5;++j){
i=插入(&注意,“你好”,i);
printf(“%s\n”,注释[i-1]。名称);
}
系统(“暂停”);
}
插入整数(新闻**注释,字符*文本,整数i){
(*注)[i].name=strdup(文本);
*注=realloc((*注),(++i+1)*sizeof(新闻));
返回i;
}

您的分配有问题

而不是

not = realloc((*note),++i*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;
}
int插入(新闻**注释,字符*文本,int i);
int main(){
news*note=NULL;
int i=0;
int j=0;
if((note=malloc(sizeof(news)))==NULL){
返回(-1);
}
对于(j=0;j<5;++j){
i=插入(&注意,“你好”,i);
printf(“%s\n”,注释[i-1]。名称);
}
系统(“暂停”);
}
插入整数(新闻**注释,字符*文本,整数i){
(*注)[i].name=strdup(文本);
*注=realloc((*注),(++i+1)*sizeof(新闻));
返回i;
}

问题可能出在这里:

note = realloc((*note),++i*sizeof(news));
您正在重新分配静态指针,因为
note
news**

所以使用

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

多亏了随机动力

问题可能就在这里:

note = realloc((*note),++i*sizeof(news));
您正在重新分配静态指针,因为
note
news**

所以使用

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

多亏了RaNdoM_PoWneD

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

但是你的密码不好,这就是你陷入麻烦的原因

  • 你为什么把指针传给指针
  • 在主for循环中使用
    j
    的目的是什么
  • 如果您打算执行诸如
    printf
    之类的操作,则需要 当您
    malloc
    使用
    .name
    成员时,可以为
    /0
    留出空间。更好的是,因为您正在动态分配它;将另一个大小为
    .name
    的成员添加到
    news
    结构中
  • 在对OP的评论中采纳DevSolar的建议

  • #包括
    #包括
    #包括
    typedef结构新闻
    {
    大小;
    字符*名称;
    }
    新闻;
    新闻*插入(新闻*注释,字符*文本,int i)
    {
    //注意:如果note为NULL,realloc的行为类似于malloc
    新闻*new_note=(新闻*)realloc(注,(i+1)*sizeof(新闻));
    如果(新注释)
    {
    大小\u t size=strlen(文本)*sizeof(字符);
    新注释[i]。尺寸=尺寸;
    新注释[i].name=malloc(大小+1);//为/0腾出空间
    strcpy(新注释[i]。名称,文本);//同时复制尾随/0
    }
    报税表(新票据);
    }
    int main()
    {
    news*note=NULL;
    int j,k;
    
    对于(j=0;jRaNdoM_PoWneD)而言,他提供了一个技术上正确的答案

    但是你的密码不好,这就是你陷入麻烦的原因

  • 你为什么把指针传给指针
  • 在主for循环中使用
    j
    的目的是什么
  • 如果您打算执行诸如
    printf
    之类的操作,则需要 当您
    malloc
    使用
    .name
    成员时,可以为
    /0
    留出空间。更好的是,因为您正在动态分配它;将另一个大小为
    .name
    的成员添加到
    news
    结构中
  • 在对OP的评论中采纳DevSolar的建议

  • #包括
    #包括
    #包括
    typedef结构新闻
    {
    大小;
    字符*名称;
    }
    新闻;
    新闻*插入(新闻*注释,字符*文本,int i)
    {
    //注意:如果note为NULL,realloc的行为类似于malloc
    新闻*new_note=(新闻*)realloc(注,(i+1)*sizeof(新闻));
    如果(新注释)
    {
    大小\u t size=strlen(文本)*sizeof(字符);
    新注释[i]。尺寸=尺寸;
    新注释[i].name=malloc(大小+1);//为/0腾出空间
    strcpy(新注释[i]。名称,文本);//同时复制尾随/0
    }
    报税表(新票据);
    }
    int main()
    {
    news*note=NULL;
    int j,k;
    
    对于(j=0;jAt leat)有一个问题:您需要为字符串分配一个
    (strlen(text)*sizeof(char)+1
    的大小,以考虑零终止符。FWIW,
    sizeof(char)
    保证是
    1
    。我认为
    not=realloc(…)
    应该是
    *note=realloc(…)
    我认为
    ¬
    应该是
    ¬e
    注意
    for循环中的
    当我们在执行时,您不应该将
    realloc()
    的返回值分配给原始指针,因为这样,如果
    realloc()
    失败,您就无法恢复。至少有一个问题:您需要分配
    的大小(strlen(text)*sizeof(char)+1
    对于要考虑零终止符的字符串。FWIW,
    sizeof(char)
    保证是
    1
    。我认为
    not=realloc(…)
    应该是
    *注意=realloc(…)
    我认为
    ¬
    应该是
    &注意
    for循环中的
    当我们在循环中时,你不应该将
    realloc()
    的返回值赋给原始指针,因为这样,如果
    realloc()
    失败,你就无法恢复。我们都给出了相同的答案,哈哈:)他只是忘了用*note而不是note。如果他按照你的建议做,realloc将丢失在内存中。因为note是一个本地变量。我正在尝试该程序,错误仍然存在。还有一个