我想不出一个更好的方式来表达问题标题,但基本上,我正试图从一个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);
}
以上是我创建的测试程序,试图找出一个解决方案而不会在我的主程序中乱搞太多。所有变量,声明以及与此特定函数相关的所有其他内容与主代码中的完全相同。
我为不能发布超过此内容而感到抱歉。
答案 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
缓冲区,然后在使用后将指针指向main
和free
,或者传递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);