- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试通过 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; = segfault
任何对变量的操作都失败了。
最佳答案
当然可以将许多变量链接在一起进行打印,您只需确保格式字符串与给定的参数匹配,以免进入未定义的行为领域。
您的简化代码中的内容应该可以正常工作,这让我相信您可能将其简化太多。我建议发布导致问题的实际代码(一个完整的、能够编译的程序,表现出错误的行为),因为您给我们的代码绝对没有任何问题。数据设置正确,printf
调用正确。
我见过 printf
的实现(例如在嵌入式系统中)具有诸如 4K 最大缓冲区大小之类的限制,但您还远远没有达到这一点。
但是,看看您的(原始的,现已更改的)代码:
int len = snprintf(NULL,0, "xxx", yyy);
char *somevar = malloc(len + 1);
sprintf(NULL,0, "xxx", yyy);
如果这确实是你正在做的事情,我对你崩溃并不感到惊讶 - 你实际上并没有填充你正在做的内存分配,意味着它将被设置为某个任意值,包括可能的非空终止“字符串”。
无论如何,sprint
与 snprintf
不同,它并不真正喜欢传入 NULL 缓冲区。
第三行应采用以下形式:
sprintf(somevar, "xxx", yyy);
<小时/>
而且,最重要的是,尽管在小程序中不太可能,malloc
可以失败并返回 NULL
- 你应该始终在依赖 C 函数的值之前检查是否失败。
关于C、带有多个变量的 printf 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48004506/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!