开发者社区> 问答> 正文

指针和数组的差异在哪儿??报错

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include "string.h"
#include <Windows.h>

struct Student {
    char * name;

//char name[20];
    int age;
    
};


////////////////////////////结构体定义和初始化//////////////////////////////
int main()
{
    struct Student stu2 = { "test", 39 };
    strcpy(stu2.name, "liujun");
    printf("%s, %d \n", stu2.name, stu2.age);
    system("pause");
    return 0;
}

大家注意下这段代码中标红和标蓝的地方:

如果我把结构体中 char name[20];给注释掉,把 char * name; 给放开,程序会报错

报错位置是 strcpy(stu2.name, "liujun"); 

反之能正常运行,请问下

 char * name;

//char name[20];

这两种写法,在这里有什么不一样吗?

展开
收起
爱吃鱼的程序员 2020-06-07 22:23:21 439 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    charname[20];你可以简单的理解成先申请了一个指针name,然后给name分配了20个char大小的空间(不能再去更改空间的大小)。

    而char*name;只是申请了一个指针name,还没有给name分配空间(你可以多次给name分配不同大小的空间,分配新的空间前记得释放原来的空间)

    谢谢,明白了

    数组是一段连续的内存地址,有固定的长度,&array[0]+offset可以用指针的方式读写。

    指针是指向内存地址的量。

    有点忘了哈哈。

    问题出在调换名字的时候。到什么山,唱什么歌。指针和数组好比两座“山”,两种“定义环境”。

    1。如果采用指针定义构造体Student的姓名项数据,那在更换姓名时,就要用关联新名字的指针来代替。

    #include<stdio.h>#include"string.h"structStudent{char*name;intage;};intmain(){structStudentstu2={"test",39};//字符型指针pname指向字符串"liujun"的第一个字符'j'char*pname="liujun";//用字符型指针pname代替构造体stu2的name项指针stu2.name=pname;printf("%s,%d\n",stu2.name,stu2.age);return0;}

    2。如果采用字符数组来定义构造体Student的姓名项数据,那在变更名字时,就要用到“复制字符串”的函数。

    #include<stdio.h>#include"string.h"structStudent{charname[20];intage;};intmain(){structStudentstu2={"test",39};strcpy(stu2.name,"liujun");printf("%s,%d\n",stu2.name,stu2.age);return0;}

    注意 ,字符串有结束字符 ‘\0’.用指针指向一个字符串,打印时会是一个完整的字符串。如果字符串中的字符,用字符数组来存储,完成储存后 没有放置字符串的结束字符‘\0’.,那么,%s格式会继续输出剩下的无关字符(垃圾)。

    #include<stdio.h>intmain(){/*字符串输出完成后,可能出现"垃圾",*因为没有放置'\0'*/charar[5];ar[0]='H';ar[1]='e';ar[2]='l';ar[3]='l';ar[4]='0';printf("ar数据:%s\n",ar);/*输出数据后,不会有垃圾。*因为这个字符数组cp,*是用字符串来初始化的。*/charcp[]="Hello";printf("cp数据:%s\n",cp);/*没有垃圾,因为这个字符型指针,*是用一个字符串初始化的。*/char*p="OSChina";printf("cp数据:%s\n",p);return0;}

    输出(这种垃圾,用复制、粘贴,可能会“过滤掉”,所以用影像文档):

     

    2020-06-08 11:15:52
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
用计算和数据去改变整个世界 立即下载
重新定义计算的边界 立即下载
低代码开发师(初级)实战教程 立即下载