从char *复制到char **

时间:2014-02-09 15:20:37

标签: c

我想不出一个更好的方式来表达问题标题,但基本上,我正试图从一个sting复制到一个字符串指针(理想情况下我不会使用指针到指针,但它是一个分配)

作为一个例子,我想知道如何做到这一点:

  

strcpy(* string_pointer,string);

但是,当我尝试时,它会给我一个分段错误。

如果这太模糊了,我会发布整个代码,虽然我肯定知道那是一个不起作用的(调试器和诸如此类的东西)而我根本就不知道怎么做。我已经尝试了复制字符串的所有“常规”方法,我知道字符串已初始化,因为如果我尝试这样做:

编辑:我想现在发布代码会更容易。

int main(void) 
{
   char* string = "test";
   reverse(&string);
   return 1;
}

void reverse(char** string_pointer)
{
   int i=0, max, y=0;
   max=strlen(*string_pointer);
   char string1[max], string2[max];
   strcpy(string1, *string_pointer);
   for ( y=max-1; y>=0; --y)
   {
         string2[i] = string1[y];
         ++i;
   }
   string2[i]='\0';
   printf("%s\n",string2);  // works until here, printf was to test that
   strcpy(*string_pointer, string);
}

以上是我创建的测试程序,试图找出一个解决方案而不会在我的主程序中乱搞太多。所有变量,声明以及与此特定函数相关的所有其他内容与主代码中的完全相同。

我为不能发布超过此内容而感到抱歉。

3 个答案:

答案 0 :(得分:1)

您需要确保string_pointer指向有效的char *

char array[20];
char **string_pointer = &array;
char *string = "str";

strcpy(*string_pointer, string);

上面的代码有效,因为string_pointer指向char数组的开头,可以是strcpy的目标,并且有足够的空间来接收副本。

你的问题毕竟是你试图写一个常量字符串。尝试将main更改为:

int main(void) 
{
   char string[] = "test";
   reverse(&string);
   return 1;
}

它应该有用。

通过此更改,字符串的内存空间将在堆栈上分配。你使用它的方式,字符串由编译器在可执行文件的只读区域中分配。

P.S。你不需要复制字符串来反转它,只需循环遍历字符串本身就可以(并且更有效),停止一半的长度。

答案 1 :(得分:0)

string_pointer中是否有足够的空间。问题是你得到段错误,因为进程正在尝试写入它无法访问的内存。

使用strncpy也是安全的,并进行健全性检查。

答案 2 :(得分:0)

问题在于strcpy函数中的上一个reverse语句。 C中的字符串文字不是const限定的,因此尝试覆盖它不会发出任何警告或编译错误。但是,这样做会导致未定义的行为,并且最有可能导致分段错误。您应该在char中动态分配reverse缓冲区,然后在使用后将指针指向mainfree,或者传递char缓冲区已在main分配给reverse

标准库函数strcpy的原型是

char *strcpy(char *dest, const char *src);

dest必须足够大才能收到副本。另请注意,strcpy将终止空字节从src复制到dest,因此您的dest必须适应此情况。

void reverse(char **string_pointer, char strbuf[]);

// in main function
// C99 variable-length array, +1 for accommodating the terminating null byte

char *string = "test";
char strbuf[strlen(string) + 1]

reverse(&string, strbuf);

或者你也可以

char *reverse(char **string_pointer);

// in reverse function

char *string2 = malloc(strlen(*string_pointer) + 1);
// do stuff
return string2;

// in main

char *string = "test";
char *reversed_string = reverse(&string);

// do stuff

free(reversed_string);