C SEGFULT-按1关闭-大小为1的写入无效

C SEGFULT-按1关闭-大小为1的写入无效,c,malloc,C,Malloc,我在C语言的内存分配方面遇到了一些问题 我似乎总是在一个错误的地方写作或阅读,这里可能有我遗漏的东西: char*a=malloc(8+b+1+c+1+d+1+e+1+f+4+6); *(a+8+b+1+c+1+d+1+e+1+f+4+6)='\0'; snprintf(a,strlen(a),“xyz\%sx%sx%sx%sx%s\”,v,w,x,y,z); 有人能帮我回到正轨吗?我不知道这些变量是什么,但我认为这行是错误的: *(a+8+b+1+c+1+d+1+e+1+f+4+6) = '

我在C语言的内存分配方面遇到了一些问题

我似乎总是在一个错误的地方写作或阅读,这里可能有我遗漏的东西:

char*a=malloc(8+b+1+c+1+d+1+e+1+f+4+6);
*(a+8+b+1+c+1+d+1+e+1+f+4+6)='\0';
snprintf(a,strlen(a),“xyz\%sx%sx%sx%sx%s\”,v,w,x,y,z);

有人能帮我回到正轨吗?

我不知道这些变量是什么,但我认为这行是错误的:

*(a+8+b+1+c+1+d+1+e+1+f+4+6) = '\0';
请尝试以下方法:

*(a+8+b+1+c+1+d+1+e+1+f+4+6-1) = '\0';
写入字符串末尾需要从长度中减去一,以获得最后一个字节的索引

根据v、w、x、y和z的字符串长度,在使用
snprintf
时,您可能会使正在写入的字符串溢出。请记住
strlen()
是C字符串的长度,而不是缓冲区的长度

size\u t a\u size=8+b+1+c+1+d+1+e+1+f+4+6+1;
char*a=calloc(a_大小,sizeof(char));//calloc()自动归零
snprintf(a,a_大小,“xyz\%sx%sx%sx%sx%s\”,v,w,x,y,z);
通过在大部分未初始化的缓冲区上使用strlen(a),基本上可以得到一个介于0和NUL字节所在位置之间的随机值


您可能希望养成使用
calloc()
而不是
malloc()
的习惯,因为它会自动为您清空分配,而且开销非常小
malloc()
可以返回各种垃圾,您在使用它们之前通常需要清除这些垃圾。

我不知道您缺少了什么,但我可以肯定您的帖子缺少了什么:a.分配
n
元素可以访问
arr[0]
arr[n-1]
.OT:很抱歉,那代码很糟糕。所有这些硬编码的数字只会在任何非琐碎的代码中给你带来悲伤。至少整个表达式应该存储在一个变量中,并且不在任何地方重复。在第一行中,
e+1+e+4
可能应该是
e+1+f+4
,以使两行匹配。
snprintf(a,strlen(a)
最有可能是
snprintf(a,8+b+1+c+1+d+1+e+1+e+4+6
。为什么要写零字节?
snprintf
还是写的。(你可能想了解一下)这些变量是任意整数。非常感谢,我会试试!而且,我在
malloc()中没有看到任何
+f
…是啊,让人困惑。@MarcoBonelli哦,好主意,我只是略读了一下,以为它们是同一系列的数字和变量。这感觉像是一个疯狂的代码高尔夫拼图。但是,如果碰巧有一个零字节,
strlen(a)
将返回一个较低的值…无论出于何种原因,snprintf似乎仍在运行。变量实际上并不是这样调用的,我替换了实际的名称。