在C中,可以在声明中使用字符串文字,如下所示:
char s[] = "hello";
Run Code Online (Sandbox Code Playgroud)
或者像这样:
char *s = "hello";
Run Code Online (Sandbox Code Playgroud)
那么区别是什么呢?我想知道在编译和运行时的存储持续时间实际发生了什么.
以下代码在第2行接收seg错误:
char *str = "string";
str[0] = 'z'; // could be also written as *str = 'z'
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)
虽然这非常有效:
char str[] = "string";
str[0] = 'z';
printf("%s\n", str);
Run Code Online (Sandbox Code Playgroud)
经过MSVC和GCC测试.
我用各种各样的C教程和与指针相关的书籍一直在苦苦挣扎几个小时,但我真正想知道的是,如果可以在创建一个char指针后更改它.
这是我尝试过的:
char *a = "This is a string";
char *b = "new string";
a[2] = b[1]; // Causes a segment fault
*b[2] = b[1]; // This almost seems like it would work but the compiler throws an error.
Run Code Online (Sandbox Code Playgroud)
那么有没有办法改变字符串内的值而不是指针地址?
谢谢
编辑:
谢谢大家的回答.现在更有意义了.特别有意义的是,为什么有时它工作正常而其他时候不工作.因为有时候我会传递一个char指针,有时会传递一个char数组(char数组工作正常).
可能重复:
为什么在写入字符串时会出现分段错误?
我想编写一个函数来反转传递给它的给定字符串.但是我不能.如果我doReverse使用字符数组提供函数(请参阅下面的代码),我的代码运行良好.
我无法弄清楚为什么这不起作用.我能够访问str[0]的doReverse,但我不能用一个字符指针改变数组中的任意值.有任何想法吗?
void doReverse(char *str) {
str[0] = 'b';
}
void main(void) {
char *str = "abc";
doReverse(str);
puts(str);
}
Run Code Online (Sandbox Code Playgroud)
我知道如何通过将字符数组传递给它来编写反向函数:
void reverse1(char p[]) {
int i, temp, y;
for (i = 0, y = strlen(p); i < y; ++i, --y) {
temp = p[y-1];
p[y-1] = p[i];
p[i] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想编写另一个获取char指针作为参数的版本.
可能重复:
通过指针更改C中的字符串文字?
这是一个代码示例
void main()
{
char *i="prady"; printf("%c ",++*i);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么这个代码在gcc中给出了一个分段错误,我猜它应该给'q'.当我只使用*i++它给我结果但是预先增量只是它给我一个分段错误.
还告诉我为什么void main不是写main()函数的正确方法.