gpt4 book ai didi

c - 带字符串的指针运算

转载 作者:行者123 更新时间:2023-12-05 01:22:59 25 4
gpt4 key购买 nike

我正在学习这些概念,请帮助我了解为什么以下代码会引发段错误。我在这段代码中的意图是打印大写字母 D 并移动到下一个地址。请解释一下。谢谢你。

main()
{
char *ptr="C programming";
printf(" %c \n",++*ptr);
}

最佳答案

错误原因

您正在尝试修改一个字符串文字,它是一个不可修改的对象。这就是您遇到段错误的原因。

即使您只是简单地调用 ptr[0]++ ,这将是一个段错误。

解决方案

一种解决方案是将声明更改为:

char ptr[] = "C programming"

然后就可以修改char数组了。

它们看起来很相似?是的,字符串字面量仍然是不可修改的,但是你已经声明了一个数组,它有自己的空间,它会被字符串字面量初始化,数组存储在堆栈中,因此可以修改。

例子

这是一个完整的代码示例:

#include <stdio.h>

int test() {
char str[]="C programming";
char *ptr = str;

while(*ptr != '\0') {
// print original char,
printf("%c \n", *(ptr++));

// print original char plus 1, but don't change array,
// printf("%c \n", (*(ptr++))+1);

// modify char of array to plus 1 first, then print,
// printf("%c \n", ++(*(ptr++)));
}

return 0;
}

int main(int argc, char * argv[]) {
test();
return 0;
}

提示:您应该只启用 printf() 之一同时行,由于++运营商。

更多提示

请注意,我们声明了一个 ptr和一个 str , 因为我们不能使用 ++对数组的操作(不能更改数组的地址),因此 ++str将出现编译错误,而 ++ptr不会的。


@Update - 关于内存

(回答您的评论)

  • 字符串文字通常存储在进程的只读区域;引用C string literals: Where do they go?
  • 一个字符数组,如果在一个方法中声明,那么它被分配在栈上,因此你可以修改它;当您从字符串文字初始化 char 数组时,实际上有 2 个相同值的副本:1 是只读的; 1 是可修改的; char 数组从只读副本初始化。
  • 一个字符指针,它存储一个地址;在这种情况下,指针本身分配在堆栈上,您可以修改它。

您可能还想了解有关指针地址数组或Linux进程内存布局_或数据部分的更多信息C程序;尝试在 Google 上搜索,或引用类似 The C Programming Language, 2nd Edn 的书籍和 The Linux Programming Interface — 尽管这是关于 C 而不是 Linux 的问题。还有 The Definitive C Book Guide and List在 Stack Overflow 上。

关于c - 带字符串的指针运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35448245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com