C 需要解释Word2变量吗

C 需要解释Word2变量吗,c,cstring,strcpy,C,Cstring,Strcpy,我知道这个程序没有分配足够的内存 我需要的帮助是描述执行此代码时发生的情况 我说“因为只分配了4个空间,所以没有足够的空间,所以会导致错误。”这听起来不对。谢谢 #include <stdio.h> #include <string.h> int main() { char word1[20]; char *word2; word2 = (char*)malloc(sizeof(char)*20); printf("Sizeof

我知道这个程序没有分配足够的内存

我需要的帮助是描述执行此代码时发生的情况

我说“因为只分配了4个空间,所以没有足够的空间,所以会导致错误。”这听起来不对。谢谢

#include <stdio.h> 
#include <string.h>

int main()
{ 
    char word1[20];
    char *word2;

    word2 = (char*)malloc(sizeof(char)*20);

    printf("Sizeof word 1: %d\n", sizeof (word1));  //This line outputs 20
    printf("Sizeof word 2: %d\n", sizeof (word2));  //This line outputs 4
                                                    //before & after I used malloc
    strcpy(word1, "string number 1");
    strcpy(word2, "string number 2"); <---- What is this doing

    printf("%s\n", word1);
    printf("%s\n", word2);
}
#包括
#包括
int main()
{ 
char-word1[20];
char*word2;
word2=(char*)malloc(sizeof(char)*20);
printf(“Sizeof word 1:%d\n”,Sizeof(word1));//此行输出20
printf(“Sizeof word 2:%d\n”,Sizeof(word2));//此行输出4
//使用malloc前后
strcpy(单词1,“字符串编号1”);

strcpy(word2,“字符串编号2”);word2是一个未初始化的指针。向它写入数据有未定义的后果,但可能会崩溃。您需要在堆栈上为它分配内存(对于
word1
),或使用
malloc
动态分配内存

char *word2 = malloc(20); // arbitrary value. could use strlen(some_str)+1 also
strcpy(word2, "string number 2"); // works now
或者,对于posix系统

char *word2 = strdup("string number 2");
无论哪种情况,请确保稍后调用
free
,将此内存返回系统


注意,即使在分配内存之后,
sizeof(word2)
将保留为4。这是因为
word2
的类型为
char*
,所以
sizeof
报告的是
char*
的大小,而不是它指向的内存。

word2是一个未初始化的指针。将数据写入其中会产生未定义的后果,但可能会崩溃。您需要在第一时间为它分配内存确认(对于
word1
)或动态地使用
malloc

char *word2 = malloc(20); // arbitrary value. could use strlen(some_str)+1 also
strcpy(word2, "string number 2"); // works now
或者,对于posix系统

char *word2 = strdup("string number 2");
无论哪种情况,请确保稍后调用
free
,将此内存返回系统

请注意,即使在分配内存之后,
sizeof(word2)
仍将保持4。这是因为
word2
具有类型
char*
,因此
sizeof
报告的是
char*
的大小,而不是它指向的内存。

sizeof(word2)返回4,因为这是指针的大小

char *word2;
是一个指针,并且为其分配了0个字节(不是您提到的4个字节)

sizeof(word1)返回20,因为这是数组的大小

char word1[20]
是一个数组,为它保留了20个字节

sizeof(word2)返回4,因为这是指针的大小

char *word2;
是一个指针,并且为其分配了0个字节(不是您提到的4个字节)

sizeof(word1)返回20,因为这是数组的大小

char word1[20]

是一个数组,在您的程序中为它保留了20个字节
word2
将有一些以前的值或可能是一个垃圾值。当您执行strcpy(word2,“字符串编号2”)时;
,您正试图写入到一个您无权访问的位置,因此,您的程序会崩溃。因此,您需要分配足够的内存,以便您的程序可以写入。

在您的程序中
word2
将有一些以前的值,或者可能是一个垃圾值。当您执行
strcpy(word2,“字符串编号2”)时
,您正试图写入一个您无权访问的位置,因此,您的程序崩溃。因此,您需要分配足够的内存,以便您的程序可以写入。

好的,还有一个问题……代码为word1/word2分配的内存是否完全相同?添加到动态分配中。对不起,我不确定我是否理解。在当前代码中,
word1
word2
都在堆栈上分配,当它们超出范围时将自动回收。如果使用
malloc
(或使用它的任何中间函数),分配的内存将一直保持分配状态,直到您调用
free
。如果这不能回答您的问题,您可以尝试重新声明吗?基本上,当我将word1分配到大小20时,这与动态地将*word2分配到大小20时相同吗?int main函数的前3行基本相同。任何一种方法都会给您一个20字节的缓冲区。
word1
是一个基于堆栈的缓冲区,因此当
word1
超出范围时,它的内存会返回到系统(对您来说是不安全的)。如果
word2
是动态分配的,您可以控制它的内存可用时间(通过决定何时调用
free
)好的,还有一个问题…代码是否为word1/word2分配了完全相同的内存?添加到动态分配中。对不起,我不确定我是否理解。在您当前的代码中,
word1
word2
都是在堆栈上分配的,当它们超出范围时会自动回收。如果您使用
malloc
(或使用它的任何中间函数),分配的内存将一直保持分配状态,直到您调用
free
。如果这不能回答您的问题,您可以尝试重新声明吗?基本上,当我将word1分配到大小20时,这与动态地将*word2分配到大小20时相同吗?int main函数的前3行基本相同。任何一种方法都会给您一个20字节的缓冲区。
word1
是一个基于堆栈的缓冲区,因此当
word1
超出范围时,它的内存会返回到系统(对您来说是不安全的)。如果
word2
是动态分配的,您可以控制它的内存可用时间(通过决定何时调用
free
)好的,还有一个问题……代码为动态分配中添加的word1/word2分配的内存是否完全相同。好的,还有一个问题……代码为动态分配中添加的word1/word2分配的内存是否完全相同。