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
留出空间。

错误:

  • 您正在为
    *Name
    分配memeory,但未分配 用于
    struct\u name.name
    的内存。所以,首先需要为
    struct\u name.name

  • 正如您已经知道的,您将在
    struct\u name.name
    您应该为2个字符分配内存。(
    “A”
    是字符串,即“A”和“\0”)

有关警告:

  • 如果要使用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;
}
有关错误:

  • 您正在为
    *Name
    分配memeory,但未分配 用于
    struct\u name.name
    的内存。所以,首先需要为
    struct\u name.name

  • 正如您已经知道的,您将在
    struct\u name.name
    您应该为2个字符分配内存。(
    “A”
    是字符串,即“A”和“\0”)

有关警告:

  • 如果要使用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代码中的所有警告。请解释为什么你否决了我的答案?“试试这个”,然后是一段注释最少的代码(只有一条注释)。比较其他答案,其中