【问题标题】:function prints strange characters : v���� [duplicate]函数打印奇怪的字符:v���� [重复]
【发布时间】: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����

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

【问题讨论】:

  • 未定义的行为是未定义的。您很幸运,它没有起作用,请参阅副本。

标签: c


【解决方案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);  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2018-09-29
      • 2011-05-27
      相关资源
      最近更新 更多