当前位置:首页 » 编程软件 » 为什么我的编译器不能声明数组

为什么我的编译器不能声明数组

发布时间: 2022-08-28 03:14:15

❶ C++:为什么报错 C++的类中不能定义数组吗

1、c++类中不能初始化变量,所以下面的一句是错误的

int s[]={5,-2,1,4,-3,4,4,6,1};
出错信息如下:
leos@DingWL-WS:tmp$ g++ a.cpp
a.cpp:7:9: error: a brace-enclosed initializer is not allowed here before ‘{’ token
a.cpp:7:29: error: ISO C++ forbids initialization of member ‘s’ [-fpermissive]
a.cpp:7:29: error: making ‘s’ static [-fpermissive]
a.cpp:7:29: error: invalid in-class initialization of static data member of non-integral type ‘int [0]’
leos@DingWL-WS:tmp$

2、main函数不能放在类中

❷ C#声明数组D选项为什么错误

int [] 、 string[] 是C#里的静态数组,
数组有两个要素,1是元素,2是大小。
其中int [x],x为数组大小。
int[] {1,2,3} 1 2 3 是元素。
实例化时,可以既声明大小、又声明元素。可以单独声明元素,C#自动判断大小, 但是不能声明了大小,却不声明元素。
所以
int [] {123}, C#编译器可以判断出,这个数组有1个元素:“123”,他的大小是1位。
但是反过来, int[1]{}, 编译器是肯定没办法根据 “1个元素”,判断出这个元素到底是什么的,, 所以只能报错了。

❸ 关于c语言变量和数组的声明问题

首先声明变量了是有内存分配的。
如果定义数组后可以得到连续的内存分配(有时候特别占用空间)。所以C语言出了链表(可以不连续的村一组数据)。
下面是C语言内存分配特性,可以参考。
1、C中内存分为四个区
栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。
全局局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。
文字常量区:例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。
程序代码区:用来存放程序的二进制代码。
例子(一)
int a = 0; //全局区
void main()
{
int b; //栈
char s[] = abc; //s在栈,abc在文字常量区
char *p1,*p2; //栈
char *p3 = 123456; //123456在常量区,p3在栈上
static int c =0; //全局区
p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆
p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆
strcpy(p1, 123456); //123456放在常量区
}
例子(二)
//返回char型指针
char *f()
{
//s数组存放于栈上
char s[4] = {'1','2','3','0'};
return s; //返回s数组的地址,但程序运行完s数组就被释放了
}
void main()
{
char *s;
s = f();
printf (%s, s); //打印出来乱码。因为s所指向地址已经没有数据
}
2、动态分配释放内存
用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。
内存分配成功后要对内存单元进行初始化。
内存分配成功且初始化后使用时别越界了。
内存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后面继续使用这块内存,应在free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。

NO.1
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,hello world);
printf(str);
}
请问运行Test函数后会是什么样的结果?
NO.2
char *GetMemory(void)
{
char p[] = hello world;
retrun p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
问题同NO.1
NO.3
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str,100);
strcpy(str,hello);
printf(str);
}
问题同NO.1
NO.4
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str,hello);
free(str);
if(str != NULL)
{
strcpy(str,world);
printf(str);
}
}
问题同NO.1
我对以上问题的分析:
NO.1:程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程中做了如下动作:1申请一个char类型的指针p,2把str的内容到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符串helloworld拷贝到str指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题所在!(建议:画图理解)
NO.2:程序首先申请一个char类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"helloworld"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西.
NO.3:正确答案为可以打印出hello.但内存泄漏了!
NO.4:申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个不确定的值.所以if语句永远都不能被执行.这也是着名的"野"指针问题.所以我们在编写程序释放一个指针之后一定要人为的将指针付成NULL.这样就会避免出现"野"指针的出现.有人说"野"指针很可怕,会带来意想不到的错误.

❹ C语言中定义一个数组array[N]为什么不行

在ISO
C89以前的标准中,定义数组下标必须是常量
,而ISO
C99以上的标准支持变量的下标了
所以你的问题
要么是你的N没有定义
要么是你按新资料定义了N为变量但你的编译器太古老不支持

❺ C#不能声明数组

你那样声明数组是不可以的
namespace HW0815
{
public partial class HW0815 : Form
{
string strText;
string[] strGameTitles;

public HW0815()
{
strGameTitles = new string[10];
InitializeComponent();
}

private void btnMove_Click(object sender, EventArgs e)
{
strText = txtTest.Text;
lblTest.Text = strText;
}
}
}

char[] c;
下面要初始化的话就放到函数里面

❻ c语言问题求解 定义数组的时候,数组的长度为define定义的宏名,为什么不能编译通过我用的

用#define定义的宏名未必就是常量,这里只是文字替换而已,定义数组所用的长度必须是“常量表达式”。比如:

#defineN100
inta[N];

是可以的。但是,如果有

#defeinPprintf()
inta[P];

显然是不行的。

❼ C语言里,编译器不支持c99的IDE规定的数组只是定义长度时不能是变量,

在有的编译器中数组在定义时用的必须是常量,不能是变量。在有的编译器里其实也可以用变量的,只是不推荐使用,好像C99通过了数组定义时用变量,但是有的编译器还不能这样做,你大概是用到了这样的编译器了

❽ C++类中定义数组 比如我有个一类A 我定义 A*x[2] 这样一个东西 为什么不能通过编译

你可以这样声明,:
A* x[2];
或者:
A *x[2];
注意中间的空格.
另外, 声明是这样了, 定义的时候还要注意类型, 你声明的是一个A类型的指针的数组, 可也小心使用哦

热点内容
夸克编程 发布:2025-02-07 21:43:43 浏览:526
电源450适合哪些配置 发布:2025-02-07 21:25:24 浏览:430
微信密码一般要多少位以上 发布:2025-02-07 21:24:19 浏览:878
sqldecimal转换 发布:2025-02-07 21:17:50 浏览:658
钢管查询源码 发布:2025-02-07 21:15:25 浏览:425
滨州服务器租赁地址 发布:2025-02-07 21:13:41 浏览:438
thinkphp删除数据库数据 发布:2025-02-07 21:12:03 浏览:945
安卓智能手机哪个更便宜 发布:2025-02-07 21:10:24 浏览:144
织梦数据库连接 发布:2025-02-07 21:09:32 浏览:353
缓解情绪解压的句子 发布:2025-02-07 21:04:23 浏览:535