原谅我的新生儿!我试图创建一个接受两个char数组作为参数的函数,并返回一些JSON。这是我的代码,然后是编译警告。该程序只是在执行时段错误。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char get_json(char *sid, char *obuf)
{
char *json;
json = malloc(strlen(obuf)+37);
strcpy(json, "{\"sessionline\":{\"sid\":\"");
strcat(json, sid);
strcat(json, "\",\"line\":\"");
strcat(json, obuf);
strcat(json, "\"}}");
return json;
}
int main()
{
char *sid = "xyzxyzxyz";
char *obuf = "asdfasdfasdfasdf";
char *json = get_json(sid, obuf);
printf(json);
}
使用gcc编译时:
test.c: In function ‘get_json’:
test.c:14:9: warning: return makes integer from pointer without a cast [enabled by default]
return json;
^
test.c: In function ‘main’:
test.c:21:22: warning: initialization makes pointer from integer without a cast [enabled by default]
char *json = get_json(sid, obuf);
^
test.c:22:9: warning: format not a string literal and no format arguments [-Wformat-security]
printf(json);
^
答案 0 :(得分:1)
get_json
应该返回指针char*
,而不是char
。sid
包含在要分配的长度中,因此您的程序将导致超出范围的访问并调用未定义的行为。printf()
是危险的。试试这个:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char get_json(char *sid, char *obuf)
{
char *json;
json = malloc(strlen(sid)+strlen(obuf)+37);
if(json == NULL) return json;
strcpy(json, "{\"sessionline\":{\"sid\":\"");
strcat(json, sid);
strcat(json, "\",\"line\":\"");
strcat(json, obuf);
strcat(json, "\"}}");
return json;
}
int main(void)
{
char *sid = "xyzxyzxyz";
char *obuf = "asdfasdfasdfasdf";
char *json = get_json(sid, obuf);
if (json != NULL) fputs(json, stdout);
}
或更简单:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char get_json(char *sid, char *obuf)
{
char *json;
json = malloc(strlen(sid)+strlen(obuf)+37);
if(json == NULL) return json;
sprintf(json, "{\"sessionline\":{\"sid\":\""
"%s"
"\",\"line\":\""
"%s"
"\"}}", sid, obuf);
return json;
}
int main(void)
{
char *sid = "xyzxyzxyz";
char *obuf = "asdfasdfasdfasdf";
char *json = get_json(sid, obuf);
if(json != NULL) fputs(json, stdout);
}
答案 1 :(得分:0)
您将char *作为char返回。
您的函数声明应如下所示:
char* get_json(char *sid, char *obuf)
考虑到它的大小,你似乎也会把更多东西放到json
中。
发生段错误是因为在从char*
到char
的转换中,数字被截断为1B,因此printf(json)
尝试读取0到255之间的某个字节的内存,以前不保留。