我没有得到编译器警告,但它是段错误。那么如何在字符串的开头复制'\ 0',以便我可以使用strncat? (不允许使用strncpy并使用memcpy然后终止字符串段错误。)
我写这篇文章来说明问题:
void func(char **str)
{
*str = realloc(*str, -);
*str[0] = '\0'; // I get segfault here.
strncat(*str, -, -);
// memcpy(*str, -, -);
// *str[strlen(*str)] = '\0'; // I get segfault here.
}
int main(void)
{
char *str = NULL;
func(&str);
return 0;
}
编辑:我的意思是写strlen(* str)而不是strlen(str)。遗憾。
答案 0 :(得分:3)
第二个segfaulting行的问题是运算符优先级。
[]
的优先级高于*
,因此*str[strlen(*str)]
被解释为*(str[strlen(*str)])
- 也就是说,取消引用str + strlen(*str)
处内存指向的地址。
您想要(*str)[strlen(*str)]
- 也就是str
末尾的字符 - 取消引用。
答案 1 :(得分:0)
当程序访问的内存无效时,会发生分段错误。重新分配调用很可能无法分配所请求的内存量。在继续访问内存之前,最好先检查内存是否已正确分配。
我尝试过这个程序,在我的系统中运行良好。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(char **str)
{
*str = realloc(*str, sizeof(char) * 20);
if( *str == NULL)
{
printf("Memory allocation failed\n");
return;
}
*str[0] = '\0';
strncat(*str, "hello world", 11);
//memcpy(*str, "hello world", 11); //memcpy also works fine
//(*str) [strlen(*str)] = '\0';
printf("String : %s\n", *str);
}