我希望你能帮我解决这个问题。我有一个char指针数组,我想要保存唯一的字符串。我有一个返回char指针的方法,我设置此函数的返回值以递增数组中的值:
// array to hold strings
char * finalStack[STR_LEN] = {""};
// returns char * to store in array
char * generateStackFrame (char stackVals[]) {
static char buffer[BUF_LEN];
int index = 0;
// 8 bytes
if (stackVals[0] == stackVals[1] == stackVals[2] == stackVals[3]) {
snprintf (buffer, sizeof(buffer), "| %c |", stackVals[0]);
// 4 bytes + padding
} else {
for (index = 0; index < 4; index++) {
if (stackVals[index] == '\0')
stackVals[index] = 'X';
}
snprintf (buffer, sizeof(buffer), "| %c | %c | %c | %c |",
stackVals[3], stackVals[2], stackVals[1], stackVals[0]);
}
return buffer;
}
这个方法的调用如下:
...
finalStack[index] = generateStackFrame (stackVals);
...
我有一个生成不同值的循环,然后调用该方法并将结果设置为char *数组中的索引。这适用于第一个值,但对于每个顺序值,即使我将新char *设置为数组中的下一个位置,它也会将数组中的所有值设置为当前字符串。我猜这是一个明显的错误,也许我不完全理解这里发生的概念。
感谢您的帮助!
答案 0 :(得分:0)
由于当前编写了代码,finalStack
中的每个条目都将指向buffer
每次调用generateStackFrame
时使用的malloc
。
要解决此问题,您需要在generateStackFrame
中free
一个新缓冲区,然后填充并返回该缓冲区。
旁注:在程序中的某个时刻,您应该{{1}}所有缓冲区。
答案 1 :(得分:0)
您在函数中使用static char buffer[BUF_LEN];
。关键字static
确保在每个函数调用中使用相同的空间。因此,当您按顺序在函数外部设置值时,它们最终将指向相同的空间。基本上,数组中的所有索引都将指向同一个字符串。
要解决此问题,请每次分配新内存
char * generateStackFrame (char stackVals[]) {
char* buffer;
buffer = malloc(sizeof(char)*BUF_LEN);
///rest of code
return buffer;
}
注意 - 不要使用堆栈变量,因为它会在从函数调用返回后丢失,使用malloc
在堆上分配内存
char * generateStackFrame (char stackVals[]) {
char buffer[BUF_LEN]; //this is wrong