我在“新闻”结构中有一个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(¬,"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
会出现细分错误?有什么问题?
答案 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(¬e, "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));
您正在重新分配静态指针,因为note
是news**
所以使用
*note = realloc((*note),(++i + 1)*sizeof(news));
感谢RaNdoM_PoWneD
答案 2 :(得分:1)
RaNdoM_PoWneD提供了技术上正确的答案。
但你的代码并不好。这就是你遇到这个麻烦的原因。
j
的目的是什么?printf
之类的事情,你需要做
当/0
成员malloc
时.name
的空间。更好的是,因为你正在动态分配它;将另一个.name
大小的成员添加到news
结构。
#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;
}
的
的调试的难度是首先编写代码的两倍。 因此,如果您尽可能巧妙地编写代码,那么您就是 定义,不够聪明,无法调试它。 的
Brian Kernighan