我在 main() 中有字符串
char *string = NULL;
然后我有一个函数
foo(char *s){
s = realloc( ... );
..
}
如果字符串不够长,我想做的是为字符串重新分配内存,所以当我在 main() 中访问这个函数时,我必须把它写成 foo(&string)
或 foo(字符串)
?
它会在 foo() 函数之外更改 s
的地址吗?
最佳答案
字符串不是指针、数组或类似的东西。
C 中的字符串被定义为由零元素终止的非零元素序列,除非另有说明
char
类型。
这些字符串通常保存在数组中,数组名称用于通俗地引用它们。因此,您没有在
main()
中有一个字符串。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/