这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct test
{
int *a;
char *s;
}TEST;
int main (void)
{
TEST A,B;
A.a[0] = 1;
A.a[1] = 2;
A.s = "abc";
B.a[0] = 1;
printf("%s\n", A.s);
printf("%d\n", A.a[0]);
printf("%d\n", A.a[1]);
return 0;
}
当我编译时,我收到了“分段错误”。
当我删除行B.a[0] = 1;
时,效果很好。为什么呢?
答案 0 :(得分:2)
您使用具有自动存储持续时间的未初始化变量的值来调用未定义的行为,这是不确定的。
在使用之前,您必须分配一些缓冲区并将其分配给A.a
和B.a
。
试试这个:
#include <stdio.h>
#include <stdlib.h>
typedef struct test
{
int *a;
char *s;
}TEST;
int main (void)
{
TEST A,B;
/* add these 2 lines to allocate some buffer */
A.a = malloc(sizeof(int) * 2);
B.a = malloc(sizeof(int) * 2);
A.a[0] = 1;
A.a[1] = 2;
A.s = "abc";
B.a[0] = 1;
printf("%s\n", A.s);
printf("%d\n", A.a[0]);
printf("%d\n", A.a[1]);
/* add these 2 lines to free what you allocated */
free(A.a);
free(B.a);
return 0;
}
为malloc()
添加错误处理将使此代码更好。
答案 1 :(得分:1)
代码未能为指针A.a
和B.a
分配内存。
将[]
- 运算符应用于它们取消引用它们(同时仍指向&#34;无处&#34;),这会引发未定义的行为。从那时起,任何事情都可能发生。