C中结构的动态分配
我在“news”结构中有一个char*,如下所示: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));
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(¬,"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(¬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;
}
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(¬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;
}
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_PoWneDRaNdoM_PoWneD提供了一个技术上正确的答案 但是你的密码不好,这就是你陷入麻烦的原因
j
的目的是什么printf
之类的操作,则需要
当您malloc
使用.name
成员时,可以为/0
留出空间。更好的是,因为您正在动态分配它;将另一个大小为.name
的成员添加到news
结构中#包括
#包括
#包括
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是一个本地变量。我正在尝试该程序,错误仍然存在。还有一个