为什么我不能在char*中编辑一个char?

问题描述 投票:7回答:5

下面是一个非常简单的例子。 在Mac OS X (Snow Leopard)上使用gcc可以很好地编译。 在运行时,它输出了总线错误。10. 这里发生了什么?

char* a = "abc";
a[0] = 'c';
c gcc c-strings
5个回答
8
投票

你的代码设置 a 的指针。"abc",这是不能修改的文字数据。 当你的代码违反了这个限制,并试图修改值时,就会发生总线错误。

试试这个。

char a[] = "abc";
a[0] = 'c';

这将创建一个char数组(在你的程序的正常数据空间中),然后... 副本 字符串的内容到你的数组中。 现在 你应该没有问题对它进行修改。


3
投票

你正在尝试修改一个字符串常量。 用这个来代替。

char a[] = "abc";
a[0] = 'c';

3
投票

这个

char* a = "abc";

依靠的是一种危险的隐性转换,从 const char[] 字符串类型)改为 char*. (在C++中,这种转换已经被废弃了十多年。不过我不知道C语言的情况)。)

字符串不能被改变。


1
投票

char *str = "string"; 在这种情况下,它被视为一个只读的文字。这类似于写 const char *str = "string". 也就是指针指向的值是 str 是一个常数。试图编辑将导致总线错误。


1
投票

char *a = "abc" 是一个常量字符串,存储在 .data ELF二进制的部分。你不允许修改这个内存,如果你这样做,你会招致未定义的行为,在某些情况下,它不会给出错误,但不会修改内存,在你的情况下,你会得到一个总线错误,因为你试图访问内存,你通常不能(为了写的目的)。

© www.soinside.com 2019 - 2024. All rights reserved.