gpt4 book ai didi

c - 动态内存分配的字符指针分析

转载 作者:行者123 更新时间:2023-11-30 18:39:06 26 4
gpt4 key购买 nike

我用 C 语言编写了以下代码。我需要了解在通过 malloc() 动态为字符指针分配内存后,如何执行字符串复制操作。

我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFFSZ 20
int main()
{
char *name = NULL;
char my_name[BUFFSZ] ;
memset(my_name,0,BUFFSZ);
strcpy(my_name, "vinothkumarsaradavallivaradathirupathi");
printf("string copied is %s\n",my_name);
if ((name = malloc(1 + strlen(my_name)+1)) != NULL)
strcpy(name,my_name);
printf("Name is %s\n",name);
free(name);
name = NULL;
return 0;
}

实际输出:

string copied is vinothkumarsaradavallivaradathirupathi
Name is vinothkumarsaradavalliva��

根据代码,我期望得到下面的输出,但只得到上面的一个。如果有人清楚地解释这一点将会很有帮助。

预期输出:

string copied is vinothkumarsaradaval
Name is vinothkumarsaradaval

当我在 GDB 中运行此代码时,我得到以下输出:

Breakpoint 2, main () at first_pgm.c:12
12 memset(my_name,0,BUFFSZ);
(gdb) n
14 strcpy(my_name, "vinothkumarsaradavallivaradathirupathi");
(gdb) p name
$1 = 0x0
(gdb) p my_name
$2 = '\000' <repeats 19 times>
(gdb) n

Breakpoint 3, main () at first_pgm.c:15
15 printf("string copied is %s\n",my_name);
(gdb) p my_name
$3 = "vinothkumarsaradaval"
(gdb) n
string copied is vinothkumarsaradavallivaradathirupathi

这里,为什么“$3”和“字符串复制”输出是冲突的?

最佳答案

Expected Output

等等。您无法从此代码中获得预期输出。此代码生成 undefined behavior .

在你的代码中

 strcpy(my_name,  "vinothkumarsaradavallivaradathirupathi")

您超出了分配的内存。在您的情况下,my_name没有足够的内存来保存源字符串文字的完整内容。

结果:未定义的行为。

请为目标缓冲区分配足够内存,以便它可以容纳源字符串和空终止符。

也就是说,

  1. Do not cast malloc() 和系列的返回值。

  2. 当您不这样做时,main() 的推荐(而是必需)签名是 int main(void)打算使用任何命令行参数。

关于c - 动态内存分配的字符指针分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31059703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com