【问题标题】:C error about pointer [duplicate]关于指针的C错误[重复]
【发布时间】:2016-10-19 11:51:16
【问题描述】:

谁能解释为什么这段代码不起作用,请!非常感谢!

#include <stdio.h>

void changer(char * tp)
{
    int i=0;
    tp[0]='b';
}

int main(void)
{
    char *st="aaab";
    changer(st);
    printf("%s",st);
}

【问题讨论】:

  • 试试char st[]="aaab";
  • 当你声明一个指针变量,即使用那个 (*) 符号时,你还必须分配指针指向的空间。 malloc()。如果您不这样做,然后使用您处于未定义行为领域的指针
  • @k_kaz 当我正确理解这里的 cmets 时:stackoverflow.com/questions/40129319/difference-between-0-and-0 这将是合法的
  • @KamiKaze:将字符串文字分配给指针不是问题,但尝试修改字符串文字是。
  • @AleksiTorhamo 确实如此,但 k_kaz 并没有指出这一点。他在谈论分配它的必要性,在这一点上声明过程有效,这是错误的。修改是usr所说的问题。

标签: c pointers


【解决方案1】:

此声明

  tp[0]='b';

导致undefined behaviour,因为tp 指向一个字符串文字。不允许在 C 中修改字符串文字。

你可以使用数组:

 char st[] = "aaab";

你可以修改。

【讨论】:

  • 谢谢你,我虽然 type a[] & type* 是一样的!
  • 区别在于char *st = "aaab"将字符串字面量的地址放在了指针st中,而char st[] = "aaab"实际上是复制了内容 将文字放入数组的内存中。第二种形式等价于char st[5]; st[0] = 'a'; st[1] = 'a'; st[2] = 'a'; st[3] = 'b'; st[4] = '\0';
【解决方案2】:
  char *st="aaab";

该语句表示st是指针变量,而“aaab”是字符串常量。

不如试试

  char st[]="aaab";

该语句表明它将 st 声明为 char 数组 [5] 并复制字符串文字的内容。这里 st 是一个常量指针。

【讨论】:

  • 告诉我上面的答案有什么问题
  • "st 是一个指针变量,但 "aaab" 是 [a] 字符串常量":虽然从技术上讲是正确的,但这种赋值在 C 中是完全允许的,你所说的并不能解释 OP 的问题。至于“此语句表明 st 是 [a] 指针常量”,那是不正确的;它将st 声明为char 的数组[5] 并复制字符串文字的内容。 usr的回答是正确的。
  • @trentcl 更改合并
猜你喜欢
  • 2017-08-10
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2013-07-14
  • 2013-03-11
  • 1970-01-01
相关资源
最近更新 更多