我在使用简单的复制功能时遇到了一些问题:
void string_copy(char *from, char *to) {
while ((*to++ = *from++) != '\0')
;
}
它需要两个指向字符串的指针作为参数,它看起来不错但是当我尝试它时我有这个错误:
Segmentation fault: 11
这是完整的代码:
#include <stdio.h>
void string_copy(char *from, char *to);
int main() {
char *from = "Hallo world!";
char *to;
string_copy(from,to);
return 0;
}
谢谢大家
答案 0 :(得分:6)
您的问题与您的副本的目的地有关:它是一个尚未初始化的char*
。当您尝试将C字符串复制到其中时,您会得到未定义的行为。
您需要初始化指针
char *to = malloc(100);
或改为使其成为一个字符数组:
char to[100];
如果您决定使用malloc
,则需要在完成复制的字符串后调用free(to)
。
答案 1 :(得分:3)
您需要为to
分配内存。类似的东西:
char *to = malloc(strlen(from) + 1);
当不再需要时,不要忘记通过free(to)
呼叫释放已分配的内存。
答案 2 :(得分:1)
在这个程序中
#include <stdio.h>
void string_copy(char *from, char *to);
int main() {
char *from = "Hallo world!";
char *to;
string_copy(from,to);
return 0;
}
指针to
具有不确定的值。结果该程序具有未定义的行为。
函数string_copy
的界面也是错误的。它表示它不保证from
指向的字符串不会被更改。
在C中还有一个通用约定,处理字符串的函数通常会返回指向目标字符串的指针。
该函数应声明为
char * string_copy( const char *from, char *to );
^^^^^^ ^^^^^
它的定义可能看起来像
char * string_copy( const char *from, char *to )
{
for ( char *p = to; ( *p = *from ) != '\0'; ++p, ++from )
{
;
}
return to;
}
程序可能看起来像
#include <stdio.h>
#include <string.h>
#include >stdlib.h>
char * string_copy( const char *from, char *to );
int main( void )
{
char *from = "Hallo world!";
char *to;
to = malloc( strlen( from ) + 1 );
puts( string_copy( from, to ) );
free( to );
return 0;
}
char * string_copy( const char *from, char *to )
{
for ( char *p = to; ( *p = *from ) != '\0'; ++p, ++from )
{
;
}
return to;
}
考虑到您可能不会使用声明为
的指针to
char *from = "Hallo world!";
char *to = "Hello everybody!";
函数中的因为字符串文字是不可变的。