【发布时间】:2021-04-27 07:22:29
【问题描述】:
我有一个 char pointer 和这样的字符串文字 char *d="abc"; 我正在递增它
*(d+1)
如果我做printf("%c",*(d+1)),我会得到类似b的东西
但是当我有这些行时
char *c={'a','b','c'}
printf("%c\n",*(c+1)); /// CAUSES SegFault
上面抛出异常。当我尝试使用 gdb 进行回溯和打印 *(c+1) 时,它显示 $1 = 0x61 <error: Cannot access memory at address 0x61>
所以我的问题是为什么这与我将字符串文字分配给char pointer 相比不起作用
当我将 int 的数组分配给 int pointer 并以这种方式递增时,也会发生同样的情况
【问题讨论】:
-
你不会在
char *c={'a','b','c'}行上看到“警告:多余的东西”“警告:不好的东西”吗? -
我很惊讶
char *c={'a','b','c'}有效(也因为你错过了一个分号)。但是您正在尝试将数组初始化为指针。将其替换为char c[] = {'a', 'b', 'c'};或char *c = (char []) {'a', 'b', 'c'}; -
您正在将
c初始化为'a',而不是您似乎期望的指向数组的指针。编译器应该对此发出严重警告。 -
main.c:10:13: warning: initialization of ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]我收到了这些警告 -
@user786 正如尼尔森所说,您将文字
'a'(在 C 中是int,而不是char,因此在警告中提到了int)给char *,所以它进行了隐式转换,c持有与'a'的 ASCII 值等效的地址。
标签: c pointers initialization scalar braced-init-list