程序可悲地崩溃了,我不知道为什么 [重复]

Program sadly crashes and I have no clue why [duplicate]

提问人:gravechest 提问时间:4/11/2022 最后编辑:Vlad from Moscowgravechest 更新时间:4/11/2022 访问量:70

问:

有谁知道为什么这个程序在“printf”处崩溃,老实说,我不知道,提前致谢。在此处输入图像描述


从评论中添加:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct{ 
    char *content; 
}DATABASE;

DATABASE *database; 

void example(DATABASE *db){ 

    db = malloc(sizeof(DATABASE));
    db[0].content = calloc(6,1); 
    memcpy(db[0].content,"hello",6);
}

void main(){ 

    example(database); //it crashes here!!! 
    printf("%s\n",database[0].content); 
}
C 指针 引用传递 按 值传递 函数定义

评论

3赞 ewokx 4/11/2022
欢迎来到 SO。请将您的代码作为文本而不是图像包含在内。
4赞 Vlad from Moscow 4/11/2022
@gravechest 为什么你认为程序可悲地崩溃了?也许它愉快地崩溃了:)
0赞 Vlad from Moscow 4/11/2022
@gravechest 将代码从注释移动到问题。

答:

2赞 Dialecticus 4/11/2022 #1

进行调用时,变量未初始化。此外,此变量(指针)的 COPY 也会传递给函数。在函数内部,此 COPY 已初始化,但该副本在函数结束时超出了范围。调用 时,变量具有原始的未初始化值。example(database)databaseprintfdatabase

努力学习如何逐步调试代码。这将使您的编程变得更加容易。

评论

0赞 gravechest 4/11/2022
啊,是的,这就是问题所在,感谢您的帮助,祝您有美好的一天。
3赞 Vlad from Moscow 4/11/2022 #2

问题在于,在文件作用域中声明的指针被初始化为 null 指针。database

它按值传递给函数。也就是说,该函数处理指针值的副本。函数中副本的更改不会反映在指针本身的值上。因此,取消引用空指针会导致未定义的行为。exampledatabase

您需要通过指向指针的指针(指向指针的指针)间接地通过引用传递指针。取消引用函数中的指针,您将可以直接访问原始指针的值。

例如

void example(DATABASE **db){ 

    *db = malloc(sizeof(DATABASE));
    ( *db )->content = calloc(6,1); 
    memcpy( ( *db )->content,"hello",6);
}


//...

example( &database );

注意,根据 C 标准,没有参数的函数应声明如下main

int main( void )

评论

0赞 chux - Reinstate Monica 4/11/2022
省略 C 规范“或以某种其他实现定义的方式”的可能性的附带问题可能允许 .IAC,这里不需要这个问题。main()void main()