C 为什么这个程序会崩溃?我错误地分配了内存吗
这个程序正在崩溃。请告诉我有什么问题。当我在结构中使用数组而不是像C 为什么这个程序会崩溃?我错误地分配了内存吗,c,C,这个程序正在崩溃。请告诉我有什么问题。当我在结构中使用数组而不是像Name[12]这样的指针时,它不会崩溃。我想在动态内存分配中有一些问题。请帮忙 #include <stdio.h> struct struct_tag { int number; char *Name; } struct_name; main() { struct_name.number = 34; char *Name = (char *) malloc(sizeof(ch
Name[12]
这样的指针时,它不会崩溃。我想在动态内存分配中有一些问题。请帮忙
#include <stdio.h>
struct struct_tag
{
int number;
char *Name;
} struct_name;
main()
{
struct_name.number = 34;
char *Name = (char *) malloc(sizeof(char));
strcpy(struct_name.Name,"A");
printf("%d", struct_name.number);
}
#包括
结构标签
{
整数;
字符*名称;
}结构名称;
main()
{
struct_name.number=34;
char*Name=(char*)malloc(sizeof(char));
strcpy(结构名称,“A”);
printf(“%d”,结构名称.编号);
}
首先仔细查看代码
char *Name = (char *) malloc(sizeof(char));
strcpy(struct_name.Name,"A");
共享分配的内存(char*Name
)和复制字符串的内存(struct\u Name.Name
)
这里不为struct\u name.name
分配内存。您还为一个字符分配了内存,并尝试复制两个字符。('A'和'\0')
应该是
struct_name.Name = malloc(2);
首先仔细查看代码
char *Name = (char *) malloc(sizeof(char));
strcpy(struct_name.Name,"A");
共享分配的内存(char*Name
)和复制字符串的内存(struct\u Name.Name
)
这里不为struct\u name.name
分配内存。您还为一个字符分配了内存,并尝试复制两个字符。('A'和'\0')
应该是
struct_name.Name = malloc(2);
您正在分配单个字符:
char *Name = (char *) malloc(sizeof(char));
然后再也不要用这些记忆做任何事情。毫无疑问,您是想为struct\u name.name
分配内存。但即使您这样做了,也会用两个字符('a'
和'\0'
)填充它:
这将导致一个完全不同的错误
你想说:
由于(a)您不应该强制转换malloc()的结果,并且(b)
sizeof(char)
始终是1
,并且(c)您需要在字符串末尾为0
留出空间。您正在分配一个字符:
char *Name = (char *) malloc(sizeof(char));
然后再也不要用这些记忆做任何事情。毫无疑问,您是想为struct\u name.name
分配内存。但即使您这样做了,也会用两个字符('a'
和'\0'
)填充它:
这将导致一个完全不同的错误
你想说:
因为(a)您不应该强制转换malloc()
的结果,(b)sizeof(char)
始终是1
,并且(c)您需要在字符串末尾为0
留出空间。错误:
- 您正在为
分配memeory,但未分配 用于*Name
的内存。所以,首先需要为struct\u name.name
struct\u name.name
- 正如您已经知道的,您将在
您应该为2个字符分配内存。(struct\u name.name
是字符串,即“A”和“\0”)“A”
- 如果要使用strcpy函数,请在代码中包含
string.h
- 另外,如果您正在使用
,请在代码中包含malloc
stdlib.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct struct_tag
{
int number;
char *Name;
}struct_name;
int main()
{
struct_name.number = 34;
struct_name.Name = malloc(sizeof(char)*2); // As you will store "A"
strcpy(struct_name.Name,"A");
printf("%d \t", struct_name.number);
printf("%s \n", struct_name.Name);
return 0;
}
#包括
#包括
#包括
结构标签
{
整数;
字符*名称;
}结构名称;
int main()
{
struct_name.number=34;
struct_name.name=malloc(sizeof(char)*2);//您将存储“A”
strcpy(结构名称,“A”);
printf(“%d\t”,结构名称.编号);
printf(“%s\n”,结构名称.name);
返回0;
}
有关错误:
- 您正在为
分配memeory,但未分配 用于*Name
的内存。所以,首先需要为struct\u name.name
struct\u name.name
- 正如您已经知道的,您将在
您应该为2个字符分配内存。(struct\u name.name
是字符串,即“A”和“\0”)“A”
- 如果要使用strcpy函数,请在代码中包含
string.h
- 另外,如果您正在使用
,请在代码中包含malloc
stdlib.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct struct_tag
{
int number;
char *Name;
}struct_name;
int main()
{
struct_name.number = 34;
struct_name.Name = malloc(sizeof(char)*2); // As you will store "A"
strcpy(struct_name.Name,"A");
printf("%d \t", struct_name.number);
printf("%s \n", struct_name.Name);
return 0;
}
#包括
#包括
#包括
结构标签
{
整数;
字符*名称;
}结构名称;
int main()
{
struct_name.number=34;
struct_name.name=malloc(sizeof(char)*2);//您将存储“A”
strcpy(结构名称,“A”);
printf(“%d\t”,结构名称.编号);
printf(“%s\n”,结构名称.name);
返回0;
}
char*Name
与struct\u Name.Name
@unwind先生我的老师告诉我malloc return void指针重要的是将其转换告诉应该返回什么value@StackOverflow那我就不同意你老师的看法考虑显示链接到答案。将void*
强制转换为C中不同的指针类型是没有意义的;它不需要,而且可以隐藏实际错误,同时使代码更难阅读。“别这么做!”你在谷歌上搜索,是为了找到我第一次提到铸造时给你的链接?整圈!:)char*Name
与struct\u Name.Name
不同@unwind先生我的老师告诉我malloc return void指针重要的是将其转换告诉应该返回什么value@StackOverflow那我就不同意你老师的看法考虑显示链接到答案。将void*
强制转换为C中不同的指针类型是没有意义的;它不需要,而且可以隐藏实际错误,同时使代码更难阅读。“别这么做!”你在谷歌上搜索,是为了找到我第一次提到铸造时给你的链接?整圈!:)OP问“请告诉我这个程序有什么问题”。@Jongware:我也已经删除了OP代码中的所有警告。请解释为什么你否决了我的答案?“试试这个”,然后是一段注释最少的代码(只有一条注释)。比较其他答案,其中