将char *数组设置为单个字符串C.

时间:2014-05-06 05:14:24

标签: c arrays string pointers

我希望你能帮我解决这个问题。我有一个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 *设置为数组中的下一个位置,它也会将数组中的所有值设置为当前字符串。我猜这是一个明显的错误,也许我不完全理解这里发生的概念。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

由于当前编写了代码,finalStack中的每个条目都将指向buffer每次调用generateStackFrame时使用的malloc

要解决此问题,您需要在generateStackFramefree一个新缓冲区,然后填充并返回该缓冲区。

旁注:在程序中的某个时刻,您应该{{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