c - C 中的结构和指针

标签 c

<分区>

我在函数内部创建一个结构,然后返回它的指针。出于某种原因,我每次都得到相同的内存地址。

typedef struct list_type
{
    node_t *head;
    node_t *tail;
} list_t;

list_t newList() {
    list_t list = {NULL, NULL};
    list_t *listptr = &list;
    printf("newList: %p\n", listptr);
    return listptr;
}

输出:

newList: 0x7fffb42c8ae0
newList: 0x7fffb42c8ae0
newList: 0x7fffb42c8ae0

我在做什么?...

最佳答案

您正在堆栈上分配 list,但您正试图从函数返回对它的引用。这在 C 中是一个很大的禁忌,因为结构的内存在超出范围时会被编译器自动释放。如果您希望内存在其分配的范围之外持续存在,则需要使用 malloc

此外,list_t 和指向它的指针 (list_t*) 是两种不同的类型,您需要在函数定义中指明这一点。

list_t* newList() {
    list_t *listptr = malloc(sizeof(list_t));
    printf("newList: %p\n", listptr);
    return listptr;
}

但是,使用malloc 时要小心。由于您是手动分配内存,因此现在需要确保在使用完指针后调用 free ,否则它会泄漏,因为编译器无法释放内存你。

关于c - C 中的结构和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031343/

相关文章:

c - c中的二叉搜索树插入

c - 迭代DFS算法与递归不匹配

c - IIR滤波器差分方程中负指标的处理

c - 我试图将 return 放在代码末尾,但他们总是在 return 之前用 while 搞乱我

c - 没有 math.h 包含 - sqrt 函数返回值?

c - 结构 - 声明说明符中的两个或多个数据类型(我有分号)

c - 在 C 中按字符串长度对字符串数组进行排序

c - 确定 C 的打印

c - 使用gdb调试源代码时如何判断是否定义了宏?

c - 实现跟踪 C 内存错误的工具,找到从哪里调用我覆盖的 malloc 等