修改函数内部的字符串地址

时间:2014-12-13 02:51:14

标签: c string pointers realloc

我在main()

中有字符串
char *string = NULL;

然后我有一个功能

foo(char *s){
    s = realloc( ... );
    ..
}

我想要做的是为字符串重新分配内存,如果它不够长,那么当我在main()中访问此函数时,我是否必须将其设置为foo(&string)foo(string)

它会改变foo()函数之外的s的地址吗?

4 个答案:

答案 0 :(得分:2)

您需要传递字符串指针的地址。因为你的"字符串"实际上是一个指向char的指针,它使你想要一个"指向char"的指针,它被写成char **。当您将其传递给foo()时,您需要传递指针的地址,因此foo(&string)是正确的。

当您在功能中引用字符串时,您将需要"额外"解除引用,例如:

int n = strlen(*s);

这也适用于重新分配:

*s = realloc(...);

或者,您可以像往常一样传递它并返回(可能是新的)指针作为函数的值。例如:

char * foo(char *s)
{
    if (...)
        s = realloc(...);
    ...
    return s;
}

当然这意味着你必须在main()

中调用/使用这样的函数
string = foo(string);

答案 1 :(得分:2)

  1. 字符串不是指针,数组等。

    C中的字符串定义为由零元素终止的非零元素序列,除非另有说明类型为char
    这些字符串通常保存在一个数组中,数组名称用于通俗地引用它们。

    因此,main()中有一个字符串。

  2. C是严格按值传递的,这意味着您无法修改用于从函数内部初始化函数参数的表达式。

    但它也有指针,因此您可以传递对象的地址以启用修改该对象。

  3. 顺便说一句,使用过时的隐式int返回类型。

    将所有这些放在一起,你有:

    #include <string.h> // strcpy
    #include <stdlib.h> // realloc free abort
    #include <stdio.h>  // puts
    
    void foo(char** sz) {
        const static hw[] = "Hello world!";
        *sz = realloc(*sz, sizeof hw);
        if(!*sz) abort();
        strcpy(*sz, hw);
    }
    
    int main() {
        char* sz = 0; // Pointer for a string
        foo(&sz);
        puts(sz);
        free(sz); // Superfluous cleanup
    }
    

答案 2 :(得分:-1)

您是否在主函数中检查了realloc。

试试这个简单的。

main()
{
   char *string;
   string=(char*)malloc(10);
   printf("%p\n",string);
   string=(char*)realloc(string,20);
   printf("%p\n",string);
}

如果使用realloc重新分配内存。如果已经分配的内存realloc将不会在内存中进行更改,则内存中可用所需的内存。只需将已占用的内存空间添加到已分配的内存中如果您在大多数情况下使用单个变量,则不会更改内存地址。

如果你想使用该功能,请使用此功能。

char*foo(char*s)              
{
 s=(char*)realloc(s,20);
 printf("foo:%p\n",s);
 return s;
}

参考this

答案 3 :(得分:-1)

char* str是一个变量。这意味着它在内存中有一个地址,这个地址的内容(char * str的值)是一个char的地址。

当您分配内存时,您对char* str感兴趣,因此您可以使用其内容,因此,您将其地址发送到foo,这使您的代码看起来像这样:

    void foo(char** str) {
    *str = malloc(5*sizeof(char));
    *str = "1234";
}
int main() {
    char* str1 = NULL;
    foo(&str1);
    printf("str1 = %s\n", str1);
   return 0;
}

注意分配这样的内存是一个坏习惯,因为如果foo是一个为字符串分配内存并返回该字符串指针的函数(char*),那么你就无法释放这段记忆。