【问题标题】:Character type pointer memory allocation? [duplicate]字符型指针内存分配? [复制]
【发布时间】:2017-12-22 08:41:38
【问题描述】:
#include<stdio.h>
#define ASIZE 50
void Reverse(char *str){
    int Asize,i=0;
    char temp;
    // Find the length of the string
    while(*(str+i)!='\0'){
            i++;
    }
    Asize=i;
    // string reverse
    for(i=0;i<(Asize/2);i++){
                temp = *(str+i);
                //may be below is some error with first input method 1
                //but for input method 2 it works perfectly
               *(str+i)  =  *(str+(Asize-(i+1)));
                *(str+(Asize-(i+1))) = temp;
    }
}
int main()
{
    //input method 1. (error aries while i pass the pointer as argument)
    char *s = "abcxyz";
    //input method 2 (works perfectly while as function parameter)
    char s[ASIZE];
    scanf("%s",s);

    Reverse(s);
    printf("%s",s);
}

在主输入法 1 中,输入法 1 不能完美地用于反转字符串,但方法 2 有效。 我的概念对 char 指针的内存表示不清楚。也许我不擅长正确地提出问题,但有人请让我清楚为什么方法 1 不起作用。提前感谢您的帮助。

【问题讨论】:

  • 修改字符串常量是未定义的行为
  • @n.caillou GCC 有选项 -Wwrite-strings 在这种情况下会发出警告。

标签: c string pointers char


【解决方案1】:

"abcxyz" 实际上是一个const char[7] 类型,在某些情况下可以衰减const char*

不是 char* 类型;尝试修改字符串的行为是undefined

另一方面,char s[ASIZE]; 是具有自动存储持续时间的char 数组。您可以随意修改其中的任何元素。

【讨论】:

  • 糟糕。我想要malloc。 char *s = malloc(30); strcpy(s, "abcxyz");
  • 不要像这样回答明显的重复,请对重复投一个密切的投票。您可以在C tag wiki,FAQ 部分快速找到规范列表。在“字符串”下面有两个合适的可以用来结束这个问题。
  • @Lundin。我不同意这一点。这里的原因深埋在 OP 提交的代码中。 SO尚未就“完全重复”的含义达成共识。如果重复的目标 question 匹配,我个人会关闭一个重复的问题。
  • char *s = "abcxyz";... scanf("%s",s); 算不上深埋... stackoverflow.com/questions/164194/… 与这个非常常见的常见问题解答完全相同。
  • 如果这不是一个黑白案例,我什至不会发表评论。对于在这里做什么,社区达成了强烈的共识。我不需要向拥有 141k 代表的人解释 SO 适度是如何工作的。 OP 可以阅读链接的副本,快速查看问题中的代码与他们所拥有的非常相似,然后找到 10 多个解释问题的好答案——从规范的 C 标准参考、深入的解释到教学法、初学者——友好的。我们没有必要每天重新发明轮子 10 次,以提高声誉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2015-09-12
  • 2011-12-03
  • 2021-06-22
  • 2015-04-21
相关资源
最近更新 更多