我试图更多地理解指针,并且遇到了这个例子的问题。
typedef struct{
int areaCode;
int streetNumber;
}Address;
Address *addr;
addr->areaCode = 10000;
printf("%d\n", addr->areaCode);
我遇到了分段错误,似乎无法理解原因。
addr是一个指向Address结构的指针,所以我也试过了:
*addr->areaCode = 10000;
还有一个"间接需要指针操作数",任何想法?
答案 0 :(得分:4)
Address *addr;
你只声明了指针addr
,但它指向某个未知的地方。你没有为它分配内存空间。
要解决此问题,请转到
Address *addr = malloc(sizeof(Address));
答案 1 :(得分:1)
您尚未为结构对象分配内存。使用malloc()
或简单地声明Address
类型的变量而不是指向Address
的指针(在这种情况下,访问成员使用.
运算符而不是->
)。
Address *addr = malloc(sizeof *addr); // don't forget #include <stdlib.h>
if (addr == NULL) {
// handle failed allocation
}
// ...
free(addr); // free(addr), addr = NULL; if you like
Address addr;
答案 2 :(得分:1)
addr
未初始化,因此包含一些&#39;随机&#39;值。取消引用未初始化的指针会导致......问题
访问不允许的内存=分段错误
访问没有段错误的随机存储器会导致内存损坏。
你可以这样做:
Address myAddress;
Address *addr = &myAddress;
这将有效。首先分配然后获取指针
这将生成指向堆栈上Address
的指针。请注意它在功能结束时超出范围。
你也可以这样做:
Address *addr = malloc(sizeof(Address));
这会在堆上分配,因此实际的Address
不会超出范围。但是你需要记住free(addr);
或者引入内存泄漏。