void bar(char *str) {
str = "ok bye!";
}
int main(int argc, char *argv[]) {
char *str = "hello world!";
bar(str);
printf("%s\n", str);
return EXIT_SUCCESS;
}
但是,它说主方法中的str
值不受bar方法影响,但是为什么呢?我的理解是char *str = "hello world!";
此代码使指针str
指向字符串“ hello world”。然后,bar(str);
使str
指针指向字符串“ ok bye!”。但是为什么结果仍然是“ hello world”?
void bar(char **str_ptr) { *str_ptr = "ok bye!"; }
解决方案是将bar方法的参数更改为双指针,为什么要这样做?
str
函数中的bar
指针仅是局部变量。您不能以此来更改主代码中的str
变量。这个概念称为“按值致电”。但是由于您实际上是想更改其指向的内存,因此可以对其进行更改。请注意,不要覆盖分配的内存长度。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bar(char *str, size_t s) {
strncpy(str, "ok bye!", s);
str[s-1] = '\0'; // terminate for the case that the string was cropped
}
int main(int argc, char *argv[]) {
char str[20] = "hello world!";
printf("%s\n", str);
bar(str, sizeof(str));
printf("%s\n", str);
return EXIT_SUCCESS;
}