使用strcat进行分段错误

时间:2011-11-25 12:33:53

标签: c segmentation-fault concatenation strcat

这是我的代码:

char *name, name_log="log-";

------从用户获取'name'-----

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

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

5 个答案:

答案 0 :(得分:3)

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

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

另一方面,strcat通常是不安全的,您需要使用能够检查其使用的缓冲区大小的内容,或限制它可以连接的内容,例如strncat

答案 1 :(得分:2)

首先,如果是您的代码:

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确保您有足够的空间安全地执行所有字符串操作,三个组件的足够字符加上空终止符。

答案 2 :(得分:2)

完全不同的解决方案是:

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"

答案 3 :(得分:0)

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

你可以做到

char[20] strarray;

strcat(strarray, "log-");
strcat(strarray, "abcd");

答案 4 :(得分:0)

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

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

char[20] name_log = "log-";