user-0 提问: C结构与指针的问题

回复:
user: user-1
content: 你的第一个程序struct namect p; 你的第二个程序struct namect  *pst;

user: user-2
content: 引用 9 楼 fancyfhb 的回复:[quote=引用 7 楼 mcmay 的回复:] [quote=引用 3 楼 fancyfhb 的回复:] [quote=引用 1 楼 user-4 的回复:] struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  谢了先！！  能解释稍微具体一点吗？ 还是没理解，如何分配呢？ [/quote] 第二个程序中的指针变量struct namect * pst只是个struct namect型的指针变量，它并没有指向任何结构体（也就是没有为它分配内存空间）。例如，这里可以用malloc为它分配一个struct namect型的内存空间，pst = (struct namect *) malloc(sizeof(struct namect));，这样就可以使用pst->fname这样的引用了。而第一个程序中的函数getinfo中pst为什么可以使用呢？main函数中的&p这个结构体地址做为getinfo函数的实际参数传递（拷贝）给了这个函数中的pst，而结构体p是已经分配有地址的了，所以pst是有效的。再用malloc给它的fname成员分配空间是没有必要的，直接使用pst->fname即可。[/quote]  引用 7 楼 mcmay 的回复:[quote=引用 3 楼 fancyfhb 的回复:] [quote=引用 1 楼 user-4 的回复:] struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  谢了先！！  能解释稍微具体一点吗？ 还是没理解，如何分配呢？ [/quote] 第二个程序中的指针变量struct namect * pst只是个struct namect型的指针变量，它并没有指向任何结构体（也就是没有为它分配内存空间）。例如，这里可以用malloc为它分配一个struct namect型的内存空间，pst = (struct namect *) malloc(sizeof(struct namect));，这样就可以使用pst->fname这样的引用了。而第一个程序中的函数getinfo中pst为什么可以使用呢？main函数中的&p这个结构体地址做为getinfo函数的实际参数传递（拷贝）给了这个函数中的pst，而结构体p是已经分配有地址的了，所以pst是有效的。再用malloc给它的fname成员分配空间是没有必要的，直接使用pst->fname即可。[/quote]   试了一下，把第1个程序中的pst->fname = (char *)malloc(strlen(temp)+1);语句删掉后，程序是会报错的，  但是在这行之前加一个	printf("pst->fname address:%p\n",pst->fname);   是可以显示地址的，不知道什么原因？ 如何解释？[/quote]       你的结构体p中的*fname和*lname成员都只是指向char型变量的指针而已。在你给它们赋值之前，它们是没有被 分配内存空间的。而说结构体p占有内存空间，这是正确的。因为当你定义这个p变量时，内存中为它分配了空间，用以存放两个char型指针变量（*fname和*lname）和一个int型变量。但是*fname和*lname这两个变量只是两个指针而已，它们在结构体p中所占用的空间只能用来存放这两个指针变量本身而已。而这两个指针变量并没有指向你所指定（赋予）的地址，因为你没有给它们赋值（这个值就是某个char型变量地址）。因此，你用pst->fname = (char *)malloc(strlen(temp)+1);这样的语句来给pst->fname赋值不仅是正确的，而且是有必要的，如果你要使用它的话。        至于printf("pst->fname address:%p\n",pst->fname);这个语句能够显示地址，那是因为在你定义*fname这个变量（即定义结构体变量p）之前，在*fname这个指针变量后来所占用的空间当中，已经有了你的电脑中其他程序运行时所存放过的某个值。这个“遗留值”没有被释放掉（这是操作系统为了节约系统资源、提高运行速度而“偷的懒”），也没有因为你对*fname赋值而被覆盖掉（因为你去掉了那个malloc语句，所以就没有给*fname赋值了），因此它还继续赖在那里。当你使用printf("pst->fname address:%p\n",pst->fname);这个语句来打印*fname这个变量所占用的内存空间中的“遗留值”时，这个遗留值就以地址的格式显示出来了（你用了%p）。当然，这个“遗留值”未见得就是个地址，你用其他的格式控制符输出时，恐怕显示的结果也会不一样。

user: user-0
content: 引用 7 楼 mcmay 的回复:[quote=引用 3 楼 fancyfhb 的回复:] [quote=引用 1 楼 user-4 的回复:] struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  谢了先！！  能解释稍微具体一点吗？ 还是没理解，如何分配呢？ [/quote] 第二个程序中的指针变量struct namect * pst只是个struct namect型的指针变量，它并没有指向任何结构体（也就是没有为它分配内存空间）。例如，这里可以用malloc为它分配一个struct namect型的内存空间，pst = (struct namect *) malloc(sizeof(struct namect));，这样就可以使用pst->fname这样的引用了。而第一个程序中的函数getinfo中pst为什么可以使用呢？main函数中的&p这个结构体地址做为getinfo函数的实际参数传递（拷贝）给了这个函数中的pst，而结构体p是已经分配有地址的了，所以pst是有效的。再用malloc给它的fname成员分配空间是没有必要的，直接使用pst->fname即可。[/quote]  引用 7 楼 mcmay 的回复:[quote=引用 3 楼 fancyfhb 的回复:] [quote=引用 1 楼 user-4 的回复:] struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  谢了先！！  能解释稍微具体一点吗？ 还是没理解，如何分配呢？ [/quote] 第二个程序中的指针变量struct namect * pst只是个struct namect型的指针变量，它并没有指向任何结构体（也就是没有为它分配内存空间）。例如，这里可以用malloc为它分配一个struct namect型的内存空间，pst = (struct namect *) malloc(sizeof(struct namect));，这样就可以使用pst->fname这样的引用了。而第一个程序中的函数getinfo中pst为什么可以使用呢？main函数中的&p这个结构体地址做为getinfo函数的实际参数传递（拷贝）给了这个函数中的pst，而结构体p是已经分配有地址的了，所以pst是有效的。再用malloc给它的fname成员分配空间是没有必要的，直接使用pst->fname即可。[/quote]   试了一下，把第1个程序中的pst->fname = (char *)malloc(strlen(temp)+1);语句删掉后，程序是会报错的，  但是在这行之前加一个	printf("pst->fname address:%p\n",pst->fname);   是可以显示地址的，不知道什么原因？ 如何解释？

user: user-0
content: 修改好了，感谢以上几位！ 修改后代码如下，顺便加了两行以查看内存地址： // get first name2 #include<stdio.h> #include<string.h> #include<stdlib.h> struct namect { 	char *fname; 	char *lname; 	int length; };   int main(void) { 	char temp[81]; 	struct namect *pst; 	 	pst = (struct namect *)malloc(100); 	printf("pst address:%p\n",pst); 	printf("input your first name:"); 	gets(temp); 	pst->fname = (char*)malloc(strlen(temp)+1); 	printf("pst.fname address:%p\n",pst->fname); 	strcpy( pst->fname,temp); 	     printf("your first name is: %s \n",pst->fname);      	 	free(pst->fname); }

user: user-2
content: 引用 3 楼 fancyfhb 的回复:[quote=引用 1 楼 user-4 的回复:] struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  谢了先！！  能解释稍微具体一点吗？ 还是没理解，如何分配呢？ [/quote] 第二个程序中的指针变量struct namect * pst只是个struct namect型的指针变量，它并没有指向任何结构体（也就是没有为它分配内存空间）。例如，这里可以用malloc为它分配一个struct namect型的内存空间，pst = (struct namect *) malloc(sizeof(struct namect));，这样就可以使用pst->fname这样的引用了。而第一个程序中的函数getinfo中pst为什么可以使用呢？main函数中的&p这个结构体地址做为getinfo函数的实际参数传递（拷贝）给了这个函数中的pst，而结构体p是已经分配有地址的了，所以pst是有效的。再用malloc给它的fname成员分配空间是没有必要的，直接使用pst->fname即可。

user: user-3
content: 引用 4 楼 fancyfhb 的回复:[quote=引用 1 楼 user-4 的回复:] struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  还有，为什么在程序1的getinfo函数中，malloc可以正常执行内存分配呢？[/quote] 1中的pst是有地址的 2中的pst是没有地址的 不能直接p->fname 要先初始化

user: user-3
content: 未分配内存 野指针   传值时 会暂时分配内存

user: user-0
content: 引用 1 楼 user-4 的回复:struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  还有，为什么在程序1的getinfo函数中，malloc可以正常执行内存分配呢？

user: user-0
content: 引用 1 楼 user-4 的回复:struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname  谢了先！！  能解释稍微具体一点吗？ 还是没理解，如何分配呢？

user: user-4
content: struct namect  *pst;  // 需要首先分配内存， 然后访问pst->fname