C:将char *指针复制到另一个

时间:2016-02-07 11:10:29

标签: c arrays string pointers

我在使用简单的复制功能时遇到了一些问题:

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;
}

谢谢大家

3 个答案:

答案 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!";
函数中的

因为字符串文字是不可变的。