C:如何在不使用 malloc 的情况下编辑函数中的 C 字符串
C: How can I edit a C-string in a function without using malloc
我在 main
中有一个 string
,我想将该字符串的地址传递给将编辑该字符串内容的函数。我不想使用 malloc。
我的代码目前是这样的:
int main(){
char* str = "Hello";
char* para1[] = {"Tea", "Coffee"};
printf("str: %s\n para1: %s\n", str, para1[0]);
my_func(str, ¶1);
printf("str: %s\n para1: %s\n", str, para1[0]);
return 1;
}
int my_func(char* str, char** para1){
printf("str: %s\n", str);
str[0] = 'W';
para1[0] = "Popcorn";
return 1;
}
我不明白如何将字符串的第一个字母从 H
更改为 W
你能解释一下我做错了什么吗?
字符串文字 不可修改,因为它们通常存储在不可变数据部分你的 exe.
这与你的功能无关,以这个玩具为例:
include <stdio.h>
int main(void)
{
char* str = "Hello";
str[0] = 'g';
printf("%s\n", str);
return 0;
}
它应该会导致运行时错误,我得到:
C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
Bus error: 10
关于这个主题的信息太多了,我就不展开了。
字符串文字存储在 read-only part of the memory 中,因此您无法修改它们。
字符串文字是只读的。当你定义:
char* string_literal = "Hello";
您将获得一个指向驻留在只读内存中的文本 "Hello" 的指针。
如果将其声明为字符数组:
char string[] = "Hello";
然后可以用数组索引表示法修改string
的内容:
string[0] = "W";
现在,您可以用指向另一个字符串文字的指针替换指向字符串文字的指针。例如,
string_literal = "New string literal";
因为这里您实际做的是重新分配名为“string_literal
”的指针以指向内存中的另一个地址。指针本身是可写的,但它指向的内存是只读的。这就是您对 para1 的分配成功的原因。
我在 main
中有一个 string
,我想将该字符串的地址传递给将编辑该字符串内容的函数。我不想使用 malloc。
我的代码目前是这样的:
int main(){
char* str = "Hello";
char* para1[] = {"Tea", "Coffee"};
printf("str: %s\n para1: %s\n", str, para1[0]);
my_func(str, ¶1);
printf("str: %s\n para1: %s\n", str, para1[0]);
return 1;
}
int my_func(char* str, char** para1){
printf("str: %s\n", str);
str[0] = 'W';
para1[0] = "Popcorn";
return 1;
}
我不明白如何将字符串的第一个字母从 H
更改为 W
你能解释一下我做错了什么吗?
字符串文字 不可修改,因为它们通常存储在不可变数据部分你的 exe.
这与你的功能无关,以这个玩具为例:
include <stdio.h>
int main(void)
{
char* str = "Hello";
str[0] = 'g';
printf("%s\n", str);
return 0;
}
它应该会导致运行时错误,我得到:
C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
Bus error: 10
关于这个主题的信息太多了,我就不展开了。
字符串文字存储在 read-only part of the memory 中,因此您无法修改它们。
字符串文字是只读的。当你定义:
char* string_literal = "Hello";
您将获得一个指向驻留在只读内存中的文本 "Hello" 的指针。
如果将其声明为字符数组:
char string[] = "Hello";
然后可以用数组索引表示法修改string
的内容:
string[0] = "W";
现在,您可以用指向另一个字符串文字的指针替换指向字符串文字的指针。例如,
string_literal = "New string literal";
因为这里您实际做的是重新分配名为“string_literal
”的指针以指向内存中的另一个地址。指针本身是可写的,但它指向的内存是只读的。这就是您对 para1 的分配成功的原因。