為什麼我的編譯器不能聲明數組
❶ 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類型的指針的數組, 可也小心使用哦