使用strcat进行分段故障

这是我的代码:

char *name, name_log="log-"; 

——从用户那里得到’名字’—–

 strcat(name_log, name); char ext[] = ".log"; strcat(name_log, ext); 

我最终需要的是name_log =“log-‘name’.log”,但我得到了一个分段错误错误:((。我做错了什么,我该如何解决?Thx

首先,如果是您的代码:

 char *name, name_log="log-"; 

然后name_log是一个char,而不是char指针。

假设这是一个拼写错误,你不能附加到这样的字符串文字。 对字符串文字的修改是未定义的行为。

对于可变大小的字符串,就像user看起来一样,最安全的选择可能是分配另一个足够大的字符串来保存结果,如:

 char *name, *name_log = "log-", *ext = ".log"; // Do something to allocate and populate name char *buffer = malloc (strlen (name_log) + strlen (name) + strlen (ext) + 1); if (buffer == NULL) { // Out of memory. } else { strcpy (buffer, name_log); strcat (buffer, name); strcat (buffer, ext); // Do something with buffer. free (buffer); } 

malloc确保您有足够的空间来安全地执行所有字符串操作,三个组件的足够字符加上空终止符。

字符串文字获得分配固定数量的内存,通常在只读部分,你需要使用缓冲区。

 char buffer[64] = "log-"; strncat(buffer,".log",32); 

另外, strcat通常是不安全的,你需要使用一些东西来检查它使用的缓冲区的大小,或者限制它可以连接的东西,比如strncat

一个完全不同的解决方案是:

 const char *prefix = "log-"; const char *suffix = ".log"; // There's a "char *name" somewhere int size_needed; char *result; size_needed = snprintf(NULL, 0, "%s%s%s", prefix, name, suffix); result = malloc(size_needed + 1); snprintf(result, size_needed + 1, "%s%s%s", prefix, name, suffix); // "result" now contains the desired string. 

关于snprintf是,如果有足够的空间,它将返回它将写入的字符数。 这可以通过预先测量分配多少内存来使用,这使得复杂且容易出错的计算变得不必要。

如果你碰巧在使用asprintf的系统上,它会更容易:

 char *result = NULL /* in case asprintf fails */; asprintf(&result, "log-%s.log", name); // "result" must be released with "free" 

你需要全部分配记忆。 您无法以这种方式添加到字符串,因为添加的字符串将转到尚未分配的内存中。

你可以做

 char[20] strarray; strcat(strarray, "log-"); strcat(strarray, "abcd"); 

name_log指向静态位置:“log-”,表示无法修改,而作为strcat()的第一个参数,它必须是可修改的。

尝试将name_log的char*类型更改为char[] ,例如

 char[20] name_log = "log-";