【问题标题】:Passing pointer and copy value传递指针和复制值
【发布时间】:2016-12-05 15:03:17
【问题描述】:

我想我在这里做了一些愚蠢的事情,请帮助我理解它是什么,我遇到了崩溃:

char *data="xyz";
int EEIndex=0;
int getEEPROMindex();
void updateEEPROMindex();
void getCmd(char *cmd);
void getcmdAtIndex(int index,char *cmd);


        int main(int argc, const char * argv[]) {

        getCmd(data);
        printf("%s  ",data );
        return 0 ;
    }

        void getCmd(char *cmd)
        {
            getcmdAtIndex(EEIndex, cmd);
         }

        void getcmdAtIndex(int index,char *cmd)
        {
            char *EEPROM[]={"A","E","C","D"};

            strcpy(cmd, EEPROM[index]);
            EEIndex=index+1;

        }

【问题讨论】:

  • 它在哪里崩溃?什么是EEIndex?请发布一个可以编译的最小示例
  • EEIndex在crash的时候是0,就crash在strcpy这行,没有任何解释。
  • 天哪,这里的人是有的。这个问题有什么问题。不要得到这个邪恶。代码错了吗?这是正确的复制方式吗?
  • 不要丢失它 (; 我们只是在说明一个事实,即如果没有实际编译的最小代码示例,我们将无能为力。原因是如果我想帮助你,我需要看看你看到的问题,如果我什至不能编译你的代码,那是不可能的
  • @Curnelious - 当时的 Stack Overflow 非常不同。 “最小的例子”不是每个人都知道的短语。无论如何,这只是互联网积分。我有将近 15,000 个问题/答案,我有很多问题/答案被否决,有时是出于误解,或者是因为一个随机的人认为这是“离题”而其他人都跟风。但从长远来看,只要你不断学习和贡献,你就会走在前面。不要出汗。

标签: c


【解决方案1】:

习惯上将字符串文字设为只读。那就是:

char *data="xyz";

当您的代码尝试更改字节 xyz 时,操作系统会崩溃。

要使其可写,请将指针替换为数组;您还应该指定数组的大小。最简单的方法是:

char data[] = "xyz"; // will hold a maximum of 3 bytes (size is implicit)

char data[20]; // will hold a maximum of 19 bytes plus an end-of-string byte

你也可以使用strdup:

char* data;
...
strdup(cmd, EEPROM[index]); // instead of strcpy

但这涉及动态内存分配,我认为您不想打扰。

【讨论】:

  • 所以正确的做法,数据应该是可写的,是设置数据更大?
  • 可能会忘记freeing,因为像初学者一样了解strdup。他应该严格阅读为 n00bies 开始的 C 编程
  • 我不确定我是否得到了这个东西,虽然我读过它。你说 char data[]="xyz", 也只占 3 个字节,那为什么比指针好呢?
  • 这正是评论中的答案状态。是的,有空终止符。
  • "为什么比指针好?" - 它比指针更好,因为它是一个数组,而不是指针。数组包含可写的元素 - 很好。指针可以指向任何数据,但在这种情况下它指向只读元素,所以不好。
【解决方案2】:

strcpy正在进入静态内存空间,

char *data="xyz";

也就是说,您创建了一个字符串xyz,它在编译时存储在保留的内存位置。您无法写入该内存位置。您想分配新空间,例如 malloc

【讨论】:

【解决方案3】:

char *data="xyz"; 定义了一个指向“xyz”的字符指针,它位于只读区域,因此您无法写入该位置。哪一点你还坚持?

将其更改为 char data[] = "xyz" 确保此文字被复制到堆栈 - 所以它是可修改的。

另外,getcmdAtIndex 函数并不安全。超出索引位置怎么办?

【讨论】:

  • 投反对票?我已经标记了评论并投票反对。如果回答有问题,我会退出所有SO网络。
  • 哇,你太粗鲁了。我试图说我不是反对你的人。这里好像是一所学校。
  • 他是,他只是删除了他粗鲁的评论。
  • 好吧,没有冒犯,但可能是你的英语@Curnelious。你写它的方式听起来更像是,“我不知道为什么人们[会]这样做[这样]。投票[这个]否决。”我不是想变得粗鲁,但我也可能读错了你的评论。您额外的“this”听起来像是句子到此结束。无论如何,我们都删除我们的 cmets 并继续前进怎么样。我赞成这个答案,因为 snr 是正确的。
  • 我很惊讶[] 将文字放在堆栈上,但这是真的:stackoverflow.com/questions/2589949/…
猜你喜欢
  • 2016-12-25
  • 2011-06-14
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2013-01-13
相关资源
最近更新 更多