C 需要解释Word2变量吗
我知道这个程序没有分配足够的内存 我需要的帮助是描述执行此代码时发生的情况 我说“因为只分配了4个空间,所以没有足够的空间,所以会导致错误。”这听起来不对。谢谢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
#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分配的内存是否完全相同。