【问题标题】:Unexpected result while assigning value to a character array in dynamic memory allocation在动态内存分配中为字符数组赋值时出现意外结果
【发布时间】:2020-03-30 07:45:04
【问题描述】:

以下程序显示意外结果

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char* num1;
    num1 = malloc(100*sizeof(char));
    num1 = "38462879";
    printf("%s\n",num1);
    num1[0]='5';
    printf("%s\n",num1);
    return 0;
}

我希望它打印给定的字符串,然后打印给定的字符串,在下一行用 5 而不是 3 替换第一个字母。

但它在第一行打印给定的字符串,然后程序没有继续。

你能帮忙吗?

【问题讨论】:

  • 应避免在给出命令或答案后更改代码。
  • 你先分配动态内存。然后你扔掉那个地址并用不可变字符串文字的地址替换它。那是内存泄漏

标签: c arrays pointers dynamic-memory-allocation


【解决方案1】:

说出来

 num1 = "38462879";

你本质上是

  • 覆盖分配的内存指针(内存泄漏)
  • 使num1 指向一个字符串文字。 (试图修改内容是非法的)

稍后您尝试修改该文字的一部分将调用undefined behavior。你需要的是使用strcpy(),比如

 strcpy (num1, "38462879");

也就是说,几个一般性建议:

  • 对于托管环境,int main() 至少应为 int main(void)
  • 在使用返回值之前,您必须始终检查函数调用(尤其是库函数)是否成功。
  • 在 C 中,sizeof(char) 被定义为 1,它是一个冗余乘数。

【讨论】:

  • 使num1 指向字符串文字有什么问题?为什么修改该文字的一部分会调用未定义的行为??
  • @Martund 因为 C 标准是这么说的。我将添加相关引号,看看是否有帮助。
【解决方案2】:

不要给num1分配一个常量字符串,而是使用strcpy():strcpy(num1, "whatever");

【讨论】:

  • 您可以将常量字符串分配给 char *。但是你是对的,因为后面 num1[0] 被修改了。
  • Do not assign a constant string to num1 为什么不呢?需要一些解释。
【解决方案3】:

这是一个字符,你不能为一个字符分配内存并存储一个字符串,它只有一个字符的空间。我想你的意思是char *num1

【讨论】:

  • @SouravGhosh 编辑前是char num1。不是char* num1
  • 现在一旦改了,这个答案也应该改了吧?
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多