int a;是定义还是声明?

_Wayne_ 2013-01-10 03:07:59
#include <stdio.h>
int a;
int a = 1;

int main(void)
{
printf("a = %d\n",a);
}
在VC中不能成功,在CFree和linux下都能成功。

另外在linux下也做了另一个试验:

root@ubuntu:/home/hello# ls
hello.c hello-test.c hello-test.h
root@ubuntu:/home/hello# cat hello-test.c
#include <stdio.h>
volatile int a=1;

void puta(void)
{
printf("a = %d in hello-test\n",a);
}
root@ubuntu:/home/hello# cat hello-test.h
void puta(void);
root@ubuntu:/home/hello# cat hello.c
#include <stdio.h>
#include "hello-test.h"
int a;

int *p;

int *p2;


int *p3;
int main()
{
a = 2;
printf("a = %d\n*p = %p,*p2 = %p, *p3 = %p\n",a,p,p2,p3);
puta();
return 0;
}
root@ubuntu:/home/hello# gcc hello.c hello-test.c -o hello
root@ubuntu:/home/hello# ./hello
a = 2
*p = (nil),*p2 = (nil), *p3 = (nil)
a = 2 in hello-test
root@ubuntu:/home/hello#


从结果中可以看出,对hello.c中的a 进行修改实际就是对hello-test.c中的a进行修改。
那么请问int a;是声明吗????不分配内存吗????还是有其它原因???
求解ing!!!!!!!!!!!!!!!!!!
...全文
1918 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Wayne_ 2013-01-10
  • 打赏
  • 举报
回复
谢谢版主的细心解答!!结帖!!
jimette 2013-01-10
  • 打赏
  • 举报
回复
分配内存啊 初始化一个随机值!
haixuelang 2013-01-10
  • 打赏
  • 举报
回复
是定义。 如果只声明不定义,可以用extren int a;
_Wayne_ 2013-01-10
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
在大括号之外的 int a; 是声明兼未初始化定义. 如果用gcc的话: C/C++ code ? 123456789101112131415161718 int x; /* C (Common) 声明(可能同时也定义)变量, 到了链接阶段, */ /* 1. 如果没在其他模块发现同名(D)符号,作为未初始化的全……
那要是我定义了一个引用库里同名的没有初始化的全局变量,那我不是死的很惨?!
mymtom 2013-01-10
  • 打赏
  • 举报
回复 2
在大括号之外的 int a; 是声明兼未初始化定义. 如果用gcc的话:

int x;          /* C (Common) 声明(可能同时也定义)变量, 到了链接阶段, */
                /* 1. 如果没在其他模块发现同名(D)符号,作为未初始化的全局变量, 放在BSS */
                /* 2. 如果有在其他模块发现同名(D)符号,作为已初始化的全局变量, 放在数据段 */
int y = 1;      /* D (Data)   定义变量,作为已初始化的全局变量, 放在数据段 */
extern int z;  /* U (Undefined), 声明变量, 到了链接阶段 */
                /* 1. 如果在其他模块有且仅有一个类型(D)的同名符号,将此符号解析到此 */
                /*    (D)符号,作为已初始化的全局变量, 放在数据段 */
                /* 2. 如果在其他模块有两个或更多的类型(D)的同名符号,*/
                /*    报告“重复定义”,链接失败 */
                /* 3. 如果在其他模块未发现类型(D)的同名符号,但是至少有一个类型(C) */
                /*    的同名符号, 将此符号解析到此(C)符号上, 
                /*    作为未初始化的全局变量, 放在BSS */

简单来说,
int x;         可以在多个模块,
int x = 1;     只能在一个模块
extern int x;  可以在多个模块, 且至少还需要在其他模块有一个 int x; 或 int x = 1;

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧