#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct a {
int n;
char *p;
} a;
int main()
{
a A;
A.p = (char *)malloc(20 * sizeof(char));
A.n = 100;
strcpy(A.p, "just testing");
//A.p = "just testing" <-- runtime error
printf("%d\n%s\n", A.n, A.p);
free(A.p);
return 0;
}
如果您使用strcpy,它将毫无问题地运行。
但是,给出类似A.p = "just testing
的字符串会导致运行时错误。
如果直接输入字符串,为什么会出错?
使用strcpy和直接放置它有什么区别?
答案 0 :(得分:6)
A.p = "just testing"
使指针p
指向字符串文字"just testing"
。您分配的内存现已丢失,程序内存泄漏。现在您正在尝试释放未由malloc
,realloc
或calloc
分配的内存。
如果未分配内存,则free
的行为未定义,指针p
,malloc
,realloc
或calloc
。
答案 1 :(得分:2)
将strcpy
副本字符串文字"just testing"
的内容放入A.p
指向的内存位置(由malloc
返回)。
相反,赋值将字符串文字"just testing"
的地址分配给A.p
,其中覆盖从malloc
返回的内存地址。当您稍后调用free
时,您将传递字符串文字的地址而不是malloc的内存。将地址传递给未从free
返回的malloc
会调用undefined behavior,在这种情况下会显示崩溃。
答案 2 :(得分:0)