c - 在函数内部修改字符串地址

标签 c string pointers realloc

我在 main() 中有字符串

char *string = NULL;

然后我有一个函数

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

如果字符串不够长,我想做的是为字符串重新分配内存,所以当我在 main() 中访问这个函数时,我必须把它写成 foo(&string)foo(字符串)?

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

最佳答案

  1. 字符串不是指针、数组或类似的东西。

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

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

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

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

顺便说一句,不要使用过时的隐式 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
}

关于c - 在函数内部修改字符串地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27455038/

相关文章:

c - 如何从 C 函数返回一个多维表到 lua?

C 中的 Clock() 函数总是至少返回 50

arrays - 为什么我在执行 strcat() 时得到错误的源字符串输出?

修改字符串的Python函数

python - re.sub 仅替换前两个实例

C++ Char 指针数组

c - 何时使用指针的高级规划?

c - 消息队列不会读取枚举类型的消息

java - Android Eclipse 字符串 Txt + Edittext + 字符串 Txt = 崩溃

c++ - 可以使用一个指针来匹配 Python 中 float 变量的 int 值吗?