请问下程序中的C代码,第一段和第二段为什么不能同时存在?

十舍七匹狼 发布于 2013/04/23 20:54
阅读 690
收藏 3

第一段和第二段,如果一起编译后运行的话,会报内存错误。

如果注释了第一段,或是第二段,那么就能正常运行了,这是为什么呀?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define T List_T
typedef struct T *T;

struct T{
    T rest;
    void *first;
};


int main(int argc, char *argv[])
{
    printf("%d\n", sizeof(struct T));
    printf("%d\n", sizeof(T));

 /* 第一段 */
    struct T t;
    char *s = "Hello.";
    t.first = s;
    printf("%s\n", t.first);

 /* 第二段 */
    T d;
    char *p = "world!";
    d->first = p;
    printf("%s\n", d->first);


	return 0;
}

以下是分开编译:

以下是一起编译运行:

最近看《C语言接口与实现》,自己搞的不清楚,所以来问问。

希望热心朋友解答下。

加载中
0
txgcwm
txgcwm

你的第二段本来就是错误的,d是一个指针,还未分配内存怎么能作那些操作呢。

另外你的代码写的很诡异!

0
zhkaji
zhkaji

把typedef放在struct T之前,

typedef sruct T{
09     T rest;
10     void*first;
11 }  t,*n;
其他的自己想想

 

十舍七匹狼
十舍七匹狼
回复 @白赢东 : 《C语言接口与实现》中,多次出现此种用法,我也是想搞清楚结构体T和结构体指针T的区别呀。
cntoby
cntoby
typedef的用法没什么问题,我觉得奇怪的是那个宏,不觉得那个define很奇怪吗?还有第二段,那个d变量确实是没初始化。
0
pingdan32
pingdan32
那个宏我看了蛋都碎了,另外,第二段本来就是错的,定义了指针直接就用,连内存分配都没有,还敢执行d->first = p这个操作。。。。不报段错误那是没有天理了。。。
十舍七匹狼
十舍七匹狼
虽然没有分配内存,可是第二段为什么单独编译运行的时候正确了呢?
0
eastasiasnow
eastasiasnow
用T定义变量d时,d此时是指向struct T的指针,但定义后的程序中没有给d赋值。
0
fcsong000833
fcsong000833
应该是第二段指针未初始化造成,指针没有初始化直接使用不是所有情况下都会出问题。建议你只保留第二段编译后在不同电脑上测试(同一台电脑其随机情况往往相同,不是真正的随机),或则做个极性测试,直接将d的地址初始化为0x00000004,看结果。
十舍七匹狼
十舍七匹狼
好的,我试试。你为什么说“d的地址初始化为0x00000004”是一个极点呢?
0
excepiton
excepiton

T *d;

你应该这样定义结构体的指针才能用d->first,否则用

T d;跟第一段一样用d.first

excepiton
excepiton
哦,没看仔细了
十舍七匹狼
十舍七匹狼
看上面的typedef呀,如果2个定义是一样的话,就没必要,写2段来测了呀
0
芦苇荡
芦苇荡

输出null指针的内容不需要强制转换吗?至少c++中需要 static_cast<char*>(d->first) , c不会。

单独编译没问题?那你单独多试试!

十舍七匹狼
十舍七匹狼
没大搞懂,你说的意思呀。看来我还是太白了
芦苇荡
芦苇荡
我试了一下,真的不需要转换就能输出。 为什么单独可以,放在以前就不行了呢
0
mickelfeng
mickelfeng
   d=(struct T*)malloc(sizeof(struct T));
0
cut
cut

#define T List_T 
typedef struct T *T; 

struct T{ 
T rest; 
void *first; 
}; 

比较好奇,为啥不报重定义之类的错误,而且关键最奇葩的还是,第一段代码编译器会自动认为是T是struct T,第二段的T是struct T*,比较好奇这样的C编译器算标准的编译器么,而且第二段代码指针是野指针,难道连个warring都没么

十舍七匹狼
十舍七匹狼
明确指明T是一个struct,编译器才会认为它是一个结构体,否则的话,单独的T类型,是一个指针。这是我实验的结果,没有找到原理。
十舍七匹狼
十舍七匹狼
书上的描述是,结构体、联合体、枚举的命名空间是独立的,不同于变量、函数、类型名的。所以指向一个同名结构没有影响。 我的那个指针确实错了,没有初始化。不过我很奇怪,为什么第二段放到第一段之前编译运行会正确,而第二段在后,会错误...
返回顶部
顶部