提问人:gravechest 提问时间:4/11/2022 最后编辑:Vlad from Moscowgravechest 更新时间:4/11/2022 访问量:70
程序可悲地崩溃了,我不知道为什么 [重复]
Program sadly crashes and I have no clue why [duplicate]
问:
有谁知道为什么这个程序在“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);
}
答:
2赞
Dialecticus
4/11/2022
#1
进行调用时,变量未初始化。此外,此变量(指针)的 COPY 也会传递给函数。在函数内部,此 COPY 已初始化,但该副本在函数结束时超出了范围。调用 时,变量具有原始的未初始化值。example(database)
database
printf
database
努力学习如何逐步调试代码。这将使您的编程变得更加容易。
评论
0赞
gravechest
4/11/2022
啊,是的,这就是问题所在,感谢您的帮助,祝您有美好的一天。
3赞
Vlad from Moscow
4/11/2022
#2
问题在于,在文件作用域中声明的指针被初始化为 null 指针。database
它按值传递给函数。也就是说,该函数处理指针值的副本。函数中副本的更改不会反映在指针本身的值上。因此,取消引用空指针会导致未定义的行为。example
database
您需要通过指向指针的指针(指向指针的指针)间接地通过引用传递指针。取消引用函数中的指针,您将可以直接访问原始指针的值。
例如
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()
评论