函数打印奇怪的字符:v���� [重复]

Posted

技术标签:

【中文标题】函数打印奇怪的字符:v���� [重复]【英文标题】:function prints strange characters : v���� [duplicate] 【发布时间】:2017-06-11 02:11:14 【问题描述】:

MAIN.C 触发函数b()

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mysql.h>
#include "main.h"

int main() 


const char *a;
a = b();

printf("%s\n", a);



MAIN.H 中的

函数 b() 以结果响应

static inline const char *b()

const char* retu;
char query[300];

sprintf(query, "select * from TEST limit 1");

retu = query;

    return retu;

这是 MAIN.C 脚本打印的内容:

v����

这是奇怪的东西。不像预期的那样。 (有意)

【问题讨论】:

未定义的行为是未定义的。您很幸运,它没有起作用,请参阅副本。 【参考方案1】:

retu 指向的是query,当 b 完成时,它超出了范围,所以内存在 main 中不再有效。

要创建一个比 b 更持久的字符串,您需要在堆上分配它,例如使用 malloc。

【讨论】:

【参考方案2】:
const char* retu;
char query[300];
sprintf(query, "select * from TEST limit 1");
retu = query;
return retu;
  //query goes out of scope here

一旦函数结束query 超出范围,因为它是在堆栈上声明的。现在你试图在它超出范围后引用这个内存,这是未定义的行为。你可以分配query on堆。还记得释放内存。

 char *query = malloc(sizeof(char) * 300);  

【讨论】:

以上是关于函数打印奇怪的字符:v���� [重复]的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的java字符串数组空指针异常[重复]

处理产生奇怪结果的字节数组的字符串构造函数[重复]

分配给整数时的字符串数组会产生一个奇怪的值[重复]

打印出二维字符串数组的函数[重复]

函数中的 printf 重复打印,然后停止并正常工作

javascript奇怪的字符串比较[重复]