C,printf段错误有很多变量[关闭]

问题描述 投票:-1回答:2

尝试通过printf输出大量变量时出错。

unsigned int vmID = 11;
char vm_title[512] = "title-123qwe";
unsigned int vm_cpu = 2;
unsigned int vm_ram = 12;
char vm_serveces[2048] = "123456789qweertrty";
char vm_notes[2048] = "wertyuio2345678";
unsigned int vm_vc = 3;
unsigned int vm_dc = 12;
unsigned int vm_cl = 6;
unsigned int vm_pl = 32;
unsigned int vm_os = 0;

printf("name='%s', cpu='%d', ram='%d', services='%s', notes='%s', vcname='%d', dcname='%d', clname='%d', poolname='%d', os='%d' id='%d';", vm_title, vm_cpu, vm_ram, vm_serveces, vm_notes, vm_vc, vm_dc, vm_cl, vm_pl, vm_os, vmID);

但是,无论是个人还是小组都正常工作:

printf("name='%s,", vm_title);
printf("cpu='%d',", vm_cpu);
printf("ram='%d',", vm_ram);
printf("services='%s',", vm_serveces);
printf("notes='%s',", vm_notes);
printf("vc='%d',", vm_vc);
printf("dc='%d',", vm_dc);
printf("cl='%d',", vm_cl);
printf("pl='%d',", vm_pl);
printf("os='%d';", vm_os);

我等一下:“name ='title-123qwe',cpu ='2',ram ='12',services ='123456789qweertrty',notes ='wertyuio2345678',vcname ='3',dcname ='12',clname = '6',poolname ='32',os ='0'id ='11',name ='title-123qwe';“

附:对于我的任务,我使用的结构如(不工作):

int len = snprintf(NULL,0, "xxx", yyy);
char *somevar = malloc(len + 1);
sprintf(somevar, "xxx", yyy);

怎么了?是否可以使用单个调用或者必须在几次点击中粘合变量?

嗯。我创建了一个新文件:

#include <stdlib.h>
#include <string.h>

int main () {
unsigned int vmID = 11;
char vm_title[512] = "title-123qwe";
unsigned int vm_cpu = 2;
unsigned int vm_ram = 12;
char vm_serveces[2048] = "123456789qweertrty";
char vm_notes[2048] = "wertyuio2345678";
unsigned int vm_vc = 3;
unsigned int vm_dc = 12;
unsigned int vm_cl = 6;
unsigned int vm_pl = 32;
unsigned int vm_os = 0;

// vc_ram = vm_pl + vm_vc;

printf("name='%s', cpu='%d', ram='%d', services='%s', notes='%s', vcname='%d', dcname='%d', clname='%d', poolname='%d', os='%d' id='%d';", vm_title, vm_cpu, vm_ram, vm_serveces, vm_notes, vm_vc, vm_dc, vm_cl, vm_pl, vm_os, vmID);

printf("name='%s,", vm_title);
printf("cpu='%d',", vm_cpu);
printf("ram='%d',", vm_ram);
printf("services='%s',", vm_serveces);
printf("notes='%s',", vm_notes);
printf("vc='%d',", vm_vc);
printf("dc='%d',", vm_dc);
printf("cl='%d',", vm_cl);
printf("pl='%d',", vm_pl);
printf("os='%d';", vm_os);

return 0;
}

它工作正常。

但如果我取消注释字符串vc_ram = vm_pl + vm_vc; =段错误

任何带变量的操作都会失败。

c
2个回答
1
投票

当然有可能将许多变量链接在一起进行打印,您只需要确保您的格式字符串与给定的参数匹配,以免您进入未定义的行为区域。

您的简化代码中的内容应该可以正常工作,这让我相信您可能已经过多地简化了它。我建议发布导致问题的实际代码(一个完整的,可编译的程序,表现出错误的行为),因为你给我们的东西绝对没有错。正确设置数据并正确调用printf

我已经看到了printf(例如在嵌入式系统中)的实现,这些实现具有诸如4K最大缓冲区大小之类的限制,但是你还远远不够。


但是,请查看您的(原始的,现已更改的)代码:

int len = snprintf(NULL,0, "xxx", yyy);
char *somevar = malloc(len + 1);
sprintf(NULL,0, "xxx", yyy);

如果你真的是这样做的话,我对你崩溃并不感到惊讶 - 你实际上没有填充你正在分配的内存,这意味着它将被设置为某个任意值,包括可能的非以null结尾的“字符串”。

在任何情况下,sprint都不像snprintf,它真的不喜欢传入的NULL缓冲区。

第三行应为以下形式:

sprintf(somevar, "xxx", yyy);

而且,除此之外,尽管在一个小程序中不太可能,但malloc被允许失败并返回NULL - 在依赖C函数的值之前,您应该始终检查失败。


0
投票

尝试通过printf输出大量变量时出错。

错误可能在其他地方。如果格式控制字符串(printf的第一个参数)符合其他参数(在数量上),您可以向printf提供许多参数(可能是数百或数千个,限制是特定于实现并且在实践中非常高)。参数和类型),如果参数都是有效的。否则,它是undefined behavior。是UB的scared(你可能有一些)。

您应编译所有警告和调试信息,例如gcc -Wall -Wextra -gGCC,并改善您的代码,以获得没有警告。您应该阅读每个标准C函数以及您正在使用的每个外部函数的documentation

使用debugger gdb逐步运行程序并查询其状态,然后了解错误。您也可以使用像valgrind这样的工具来捕捉memory leaksbuffer overflows和其他memory corruption(你可能还有一些)等等。

您的错误可能在您的问题未显示的其他一些代码中。

顺便说一句,你可以使用asprintf(3),如果你的系统有它,你should test反对malloc的失败。

© www.soinside.com 2019 - 2024. All rights reserved.