抱歉我的英文不好
嗨,今天我遇到了记忆问题。 或变量问题?我不知道。
以下是我的来源,而且很简单
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errmsg.h>
typedef struct mysql_bind_list
{
MYSQL_BIND *mysql_bind;
unsigned int length;
} MYSQL_BIND_LIST;
MYSQL_BIND_LIST *create_mysql_bind_list()
{
MYSQL_BIND_LIST mysql_bind_list;
MYSQL_BIND_LIST *mysql_bind_list_point = &mysql_bind_list;
mysql_bind_list_point->mysql_bind = (MYSQL_BIND *)malloc(1);
mysql_bind_list_point->length = 0;
printf("%p\n", mysql_bind_list_point);
return mysql_bind_list_point;
}
void main()
{
MYSQL_BIND_LIST *bind_list1 = create_mysql_bind_list();
MYSQL_BIND_LIST *bind_list2 = create_mysql_bind_list();
}
我的gcc命令是
gcc -o test.out test.c `mysql_config --cflags --libs` && ./test.out && rm test.out
我应该解释那个源码,18行,使用printf打印mysql_bind_list_point的内存地址。 我希望打印不同的地址,但打印相同的地址。
$ gcc -o test.out test.c `mysql_config --cflags --libs` && ./test.out && rm test.out
0x7fff0851e2d0
0x7fff0851e2d0
怎么可能? 有人知道吗?
答案 0 :(得分:3)
您正在返回一个指向局部变量的指针,当函数返回该局部变量超出范围时,会留下一个迷路指针。使用该迷路指针会导致undefined behavior。
如果需要返回指向结构的指针,也要动态分配结构。一旦你完成了结构,请记住free
。