我理解这个程序不会分配足够的记忆。
我需要帮助的是描述执行此代码时会发生什么的解释。
我说“由于只分配了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);
}
答案 0 :(得分:4)
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*
的大小而不是它指向的记忆。
答案 1 :(得分:2)
sizeof(word2)返回4,因为这是指针的大小
char *word2;
是一个指针,并为其分配了0个字节(如上所述,不是4个)
sizeof(word1)返回20因为数组的大小
char word1[20]
是一个数组,并为它保留了20个字节
答案 2 :(得分:0)
在你的程序word2
中会有一些以前的值或者可能是垃圾值。当您执行strcpy(word2, "string number 2");
时,您正在尝试写入您无权访问的位置,因此您的程序崩溃了。因此,您需要为程序分配足够的内存。