strcpy示例程序中的缺陷

时间:2010-02-19 18:23:48

标签: c pointers

我使用以下代码将字符串内容复制到另一个字符串。 使用两个逻辑,一个用while循环(注释)工作,另一个不用(as = at)。

请帮我识别此代码中的缺陷。

提前致谢


#include<stdio.h>
#include<conio.h>
main()
{
    char *s="SourceString";
    char *t="TargetString";

    void print(char *s);
    void strcopy(char *s,const char *t);
    print(s);

    strcopy(s,t);
    print(s);
    getch();
}

void strcopy(char *as,const char *at)
{
    /*while((*as=*at)!='\0')    // working
    {
        as++;
        at++;
    }  */
    as=at;    //not working
}

void print(char *s)
{
    printf("\n Printing the Contents:");
    for(;*s!='\0';s++)
        printf("%c",*s);
    printf("\n END");
}

所有人都说这些字符串是通过Value传递的,而不是通过地址传递的。 但是我使用指针在调用函数am中调用函数的字符串的地址。 请澄清我是新手指针

5 个答案:

答案 0 :(得分:2)

as是函数参数时,写入as=anything;在函数终止时不再有效,因为它的参数不再存在(以及它的局部变量)。你没有修改字符串,你只是修改了一个临时包含字符串地址的内存单元格,而且无论如何它都会被释放。

你的问题确实是关于指针的问题。也许你可以在StackOverflow上找到一个已经问过的关于C或C ++指针的问题。

答案 1 :(得分:2)

分配如下字符串:

char *s="SourceString";

正在使用只读内存,因此修改内容将导致未定义的行为。使用数组可能会像你想象的那样工作。

char s[]="SourceString";
char t[]="TargetString";

在你的例子中,你只是在玩strcpy函数返回时被破坏的局部变量。

您可以尝试这样的事情:

void strcopy2(char **s, char **t) //<--- pointers to pointers, ouch!
{
    *t = *s; //<--- Assign the value of the pointer who's address was passed.
}

int main(void)
{
    char *s = "SourceString";
    char *t = "TargetString";

    printf("%s\n", s);
    strcopy2(&s, &t);  //<--- pass address of pointers!
    printf("%s\n", t);

}

我喜欢使用char数组,但如果我正在操作字符串。

答案 2 :(得分:1)

有效版本使用循环一次复制一个字符。

不只是将一个指针变量复制到另一个指针变量的版本。此操作不会影响程序中的任何其他操作。 as = at只修改一个局部变量并返回。因此,这不是您可以进行的优化。

答案 3 :(得分:0)

使用as=at;将局部变量复制到局部变量中。不要紧,它们是指针 - 它们是函数堆栈上的副本,因此在函数外部看不到您的更改。

答案 4 :(得分:0)

以下是您的非工作代码的两个错误。

1)您的声明 as = at 将局部变量复制到另一个本地变量。离开功能后,分配将丢失 2)你可能正在泄漏指向

之前指定的

使用中的另一个潜在问题是,通常在C中我们说 target&lt; - source ,因此 的使用情况看起来如此向后。