2

我在这里有一个菜鸟问题,无法理解这里有什么问题。我在这里有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  


void copyFrom(char * mStr, char * str); 


int main() {  

    char * srcStr = "Robert bought a good ford car";  
    char * dstStr = NULL;  
    copyFrom(srcStr, dstStr);
    printf("The string copied here is %s", dstStr);
    return 0;
}
void copyFrom(char * str, char * mStr)
{
    if(!mStr) {
        mStr = (char *)malloc((strlen(str)) + 1);
        if(mStr == NULL)
            return;
    }

    while(*mStr++ = *str++) {
        ;
    }

    mStr[strlen(str)] = '\0';
}

这不会复制字符串,但是如果使用数组而不是 dstStr 的 char 指针,则一切正常。

你能告诉我这里有什么问题吗?

4

6 回答 6

7

您需要在 malloc 之后返回 mStr 的值。现在,当您退出函数时, malloc 的返回值和指向您的字符串副本的指针会消失。它从 malloc 泄漏内存,因为它失去了对它的跟踪。

将您的功能更改为char* copyFrom(const char * str)

然后从该函数返回 mStr 。然后你可以写dstStr = copyFrom(srcStr)

现在,POSIX C 已经有了这个功能。它被称为strdup

于 2013-08-22T06:09:34.110 回答
3

在 C 中,偶数指针是按值传递的。当您将一个指针传递给一个函数时,该函数会收到一个副本——即一个新指针,它指向与调用函数中的指针相同的位置。

因此,在您的代码中,当您传递 时dstStr,您传递的是一个空指针。mStr是一个新的空指针。当您为 分配内存时mStr,此内存将分配给这个新指针,而不是dstStr. 因此,当您的函数返回时,dstStr调用函数中仍然为 NULL,并且没有任何内容指向在copyFrom(). 你有内存泄漏!

您需要dststr()作为两级指针传递以更改它在调用函数中指向的内容:

void copyFrom(char * str, char **dstStr)
{   
    char* mStr; 

    mStr = (char *)malloc((strlen(str)) + 1);
    if(mStr == NULL)
        return;


    while(*mStr++ = *str++) {
        ;
    }

    mStr[strlen(str)] = '\0';

    *dststr = mStr;

    return;
}

当然,您的函数声明和调用需要相应地更改。您的调用需要&dstStr作为参数传递,而不仅仅是dstStr.

于 2013-08-22T06:17:28.017 回答
2
char * dstStr = NULL;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);

dstStr为NULL,第一行设置它。在copyFrom分配字符串时,它不会将该字符串返回给调用者。所以你printf得到一个NULL。

于 2013-08-22T06:11:35.720 回答
1

你可以这样做,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void copyFrom(char * mStr, char * str);

int main() {
    char * srcStr = "Robert bought a good ford car";
    char * dstStr = NULL;
    dstStr = (char *)malloc((strlen(srcStr)) + 1);
    copyFrom(srcStr, dstStr);
    printf("The string copied here is %s", dstStr);
    return 0;
}

void copyFrom(char * str, char * mStr)
{
    while(*mStr++ = *str++) {
        ;
    }

    mStr[strlen(str)] = '\0';
}
于 2013-08-22T06:14:26.757 回答
0

dstStr 未分配,因此您不会将数据放在任何地方。使用 malloc 分配适当的内存块然后复制。

它与数组一起使用的原因是字符串存储在堆栈中,内存自动为它涂上一层。

这也是 C 而不是 C++,因为 C++ 字符串处理是通过 std::string 完成的。

于 2013-08-22T06:06:53.973 回答
0

您可以通过引用传递 dest,而不是返回:

void copyFrom(const char * src, char *& dest); 


int main() {  

    char * srcStr = "Robert bought a good ford car";  
    char * dstStr = 0;  
    copyFrom(srcStr, dstStr);
    printf("The string copied here is %s", dstStr);

    return 0;
}
void copyFrom(char * str, char *& mStr)
{
    if(!mStr) {
        mStr = (char *)malloc((strlen(str)) + 1);
        if(mStr == NULL)
            return;
    }
    char* it = mStr;
    while(*it++ = *str++)
    {
        ;
    }
    *it = 0;
}
于 2013-08-22T06:16:28.203 回答