问答详情
源自:5-4 字符数组的深入理解

内存分配数据不对

#include <stdio.h>


int main() {

char str[] = "hello";

char *str2 = "world";


char str3[10];


printf("input a value\n");

scanf("%s", str);

//str[3] = '\0';


printf("str is %s\n", str);

printf("str2 is %s\n", str2);

printf("str3 is %s\n", str3);

return 0;

}

下面是调试过程:

Temporary breakpoint 1, main () at main.c:3

3 int main() {

(gdb) n

5 char str[] = "hello";

(gdb) 

6 char *str2 = "world";

(gdb) 

10 printf("input a value\n");

(gdb) 

input a value

11 scanf("%s", str);

(gdb) 

aaaaaaaaaaaaaaaaaaaa

14 printf("str is %s\n", str);

(gdb) p &str

$1 = (char (*)[6]) 0x7fffffffdb00

(gdb) p &str2

$2 = (char **) 0x7fffffffdaf8

(gdb) p &str3

$3 = (char (*)[10]) 0x7fffffffdb10

(gdb) p strt

No symbol "strt" in current context.

(gdb) p str

$4 = "aaaaaa"

(gdb) p str3

$5 = "aaaa\000\000\000\000P\005"


str 是6个字节,无论我怎么输入,str打印出来的都是6个字节,并不是实际长度,还有就是为什 str 和 str3 的内存之间相差的是16个字节,而不是6个呢,str 的地址是 0x7fffffffdb00 , 而 str3 的地址是 0x7fffffffdb10

提问者:阳建 2018-05-29 12:18

个回答

  • 慕田峪1875512
    2020-03-22 18:20:38

    应该没问题的,你把程序调试到return 0再去打印str和str3的地址,因为你的str3都没初始化系统应该没有给他分配存储空间,程序还没运行到那里你就打印它的地址应该不对,我是这样理解的

  • 冯凯4387339
    2018-07-26 20:03:29

    没有问题的