struct str {
uint8_t *data;
};
int main() {
struct str *buffer;
free(buffer->data);
}
如何在免费使用前正确检查数据?此示例调用分段失败...
答案 0 :(得分:2)
在您的示例中,您释放了一个单位指针,这通常会导致seg错误。在释放指针之前无法测试指针,因此您必须确保只释放有效指针(即从malloc等返回的指针)。
编辑:正如有几位人士指出的那样,由于buffer
未初始化,仅仅访问buffer->data
的行为也会导致段错误。
答案 1 :(得分:2)
这是因为您的数据尚未分配。您只在struct str上创建一个指针。正确使用如下:
int main() {
struct str *buffer = (struct str*)malloc(sizeof(struct str));
if (buffer == NULL) { fprintf(stderr, "Error with malloc\n"); exit (EXIT_FAILURE); }
buffer->data = (uint8_t*)malloc(sizeof uint8_t);
if (buffer->data == NULL) { fprintf(stderr, "Error with malloc\n"); exit (EXIT_FAILURE); }
// Process data here
free(buffer->data);
free(buffer);
return 0;
}
答案 2 :(得分:1)
你可以释放()只从malloc()或realloc()返回的指针。给定一个任意指针,无法检查是否可以释放它。
答案 3 :(得分:1)
在调用free
之前,您需要为此分配内存。如果它未初始化,buffer->data
可以指向任何位置,并且在未初始化指针上使用free
是未定义的行为。
答案 4 :(得分:1)
除了已经说过的内容之外,如果您知道指针应该用于动态内存分配,请始终将其初始化为NULL。
如果将NULL指针传递给free()和C ++ delete,则保证不会执行任何操作。
这就是为什么在释放指针后总是将指针设置为NULL的原因。
#include <stddef.h>
int* ptr = NULL;
...
// malloc ptr or don't do a thing
free(ptr); // won't crash no matter if ptr is allocated or not
ptr = NULL; // ptr is free to be used again
答案 5 :(得分:0)
您没有分配任何内存,也没有在代码中初始化指针。
适当的用法是这样的:
struct str {
uint8_t *data;
};
int main() {
struct str *buffer;
buffer = malloca(sizeof(struct str));
if (buffer == NULL) {
return 1; // failed to allocate buffer
}
buffer->data = malloc(sizeof(uin8_t));
if (buffer->data == NULL) {
free(buffer); // failed to allocate data
return 1;
}
free(buffer->data);
free(buffer);
return 0;
}
答案 6 :(得分:0)
free()
不是您(唯一)的问题。 buffer
是一个未初始化的指针,因此取消引用它(buffer->data
)的行为几乎肯定会导致段错误。如果此代码为:
struct str {
uint8_t *data;
};
int main() {
struct str *buffer;
printf("%p\n", buffer->data);
}