c - 段错误——但指针不是 NULL

标签 c pointers memory-management segmentation-fault

<分区>

我正在用 C 做类似下面的事情:

void *initialize()
{
    my_type *ret = malloc(sizeof(my_type));
    return (void*)ret;
}

void test()
{
    my_type* ret = (mytype*)initialize();
    my_type x = *ret;
}

它在取消引用时崩溃:

Received signal 11 (Segmentation fault: 11)

指针不为空:我尝试打印指针,并得到一个值。

我还尝试在测试函数中创建一个新的 my_type,如下所示:

my_type* new = malloc(sizeof(my_type));

当我打印 new 和 ret 的整数表示时,它们是彼此非常接近的整数。所以这些东西应该在内存附近。

最佳答案

如果编译器不知道一个函数,它会假定 int 作为它的返回类型。

如果 int 的大小与函数实际返回的大小不同,编译器生成的代码可能无法返回正确的字节数。

但是,您发布的代码是正确的,并且会按预期执行,因为 initialise() 发生在使用它之前,因此编译器已经知道函数返回的类型。

很可能原始代码(您没有发布)看起来像这样(没有initialise() 的原型(prototype)):

尝试以下操作:

#include <stdlib.h> /* To pull in malloc's protoype. */

void * initialize(void);

void test()
{
    my_type x, * ret = initialize();
    if (ret)
      x = *ret;
}

void * initialize(void)
{
    my_type * ret = malloc(sizeof(*ret));
    return ret;
}

关于c - 段错误——但指针不是 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16549151/

相关文章:

c - Linux 内核 task_struct void *stack

c# - 为什么这个内存管理技巧有效?

java - JVM 创建 CSV 文件并即时压缩所需的内存

c++ - 局部变量的安全

c - 如何获得指针指向的二维数组的宽度/高度?

c - 双指针 C/C++

c - 减去指针 p - (p - 1) 如何造成整数溢出?

我可以在 C 中的 Switch Case 中的另一个案例中使用一个案例吗

c - 当参数之一是函数调用时,printf 如何在 c 中工作

C Void指针问题