老沫白 发表于 2022-7-7 11:10:28

C的初级问题

#include <stdio.h>
#define MSG "kkkkk"
#include <string.h>
int main()
{
        char ar[] = MSG;
        const char * pt = MSG;
        return 0;
}
为什么打印ar和打印pt两者不一样,书上就提了一句,没细讲

wp231957 发表于 2022-7-7 11:10:29

没看到哪里有不同啊
#include <stdio.h>
#define MSG "kkkkk"
#include <string.h>
int main()
{
      char ar[] = MSG;
      const char * pt = MSG;
      printf("AR=%s........PT=%s\n",ar,pt);
      printf("AR_len=%d........PT_len=%d\n",strlen(ar),strlen(pt));
      return 0;
}
/*
PS D:\wp> ./ct9
AR=kkkkk........PT=kkkkk
AR_len=5........PT_len=5
PS D:\wp>
*/

老沫白 发表于 2022-7-7 11:23:18

wp231957 发表于 2022-7-7 11:20
没看到哪里有不同啊

不是的朋友打印%P你试试,然后我突然想起来了,之前学C的时侯我给忘了,他的这个ar指向的是MSG副本的第一个元素,但是pt指向MSG的第一个元素

老沫白 发表于 2022-7-7 11:23:57

wp231957 发表于 2022-7-7 11:20
没看到哪里有不同啊

我真是忘了{:5_104:}

wp231957 发表于 2022-7-7 11:26:11

老沫白 发表于 2022-7-7 11:23
不是的朋友打印%P你试试,然后我突然想起来了,之前学C的时侯我给忘了,他的这个ar指向的是MSG副本的第一 ...

开玩笑啊,我要%p干啥

老沫白 发表于 2022-7-7 11:26:13

wp231957 发表于 2022-7-7 11:20
没看到哪里有不同啊

静态储存我忘得一干二净

wp231957 发表于 2022-7-7 11:27:12

老沫白 发表于 2022-7-7 11:23
不是的朋友打印%P你试试,然后我突然想起来了,之前学C的时侯我给忘了,他的这个ar指向的是MSG副本的第一 ...

哪来的副本的说法,define 就是替换   编译之前把所有MSG 都老老实实的替换为 KKKKK

老沫白 发表于 2022-7-7 11:31:13

wp231957 发表于 2022-7-7 11:27
哪来的副本的说法,define 就是替换   编译之前把所有MSG 都老老实实的替换为 KKKKK

额,他字符串是不是存储在静态存储区,但是啊,程序开始时是不是才会为数组分配内存,这个时候他才应该将字符串拷贝到数组里面啊,这不就成副本了吗?这个知识点不偏吧

老沫白 发表于 2022-7-7 11:31:44

wp231957 发表于 2022-7-7 11:26
开玩笑啊,我要%p干啥

你试试,试试就知道了

老沫白 发表于 2022-7-7 11:44:41

wp231957 发表于 2022-7-7 11:27
哪来的副本的说法,define 就是替换   编译之前把所有MSG 都老老实实的替换为 KKKKK

其实吭,要是这个C语言真的按你这么说,那真的问题大了,众所周知指向String的指针要声明为const,就是因为改变String这个行为在C里面是未定义的嘛,可是数组不用声明为const,但你看数组其实是可以改变里面的元素的,如果没有副本那不还是未定义的行为么。

老沫白 发表于 2022-7-7 11:45:18

wp231957 发表于 2022-7-7 11:27
哪来的副本的说法,define 就是替换   编译之前把所有MSG 都老老实实的替换为 KKKKK

哥们,你怎么看,你看我说的对吧,
页: [1]
查看完整版本: C的初级问题