-
char *str[3];
這是乙個指向 char 型別的指標陣列,陣列大小為 3,即 str[0]、str[1] 和 str[2] 都是指標,它們都指向 char 空間。
這樣一來,str[1][1]這種訪問是非法的。
char (*p)[3];
這是指向 char[3] 空間的指標。
使用以下命令:char (*p)[3];
p = (char (*3])malloc(3);
p[0][0] = 'a';
p[0][1] = 'b';
p[0][2] = 0;strcpy(p[0],"ab")
printf("%s", p[0]);
free(p);
不知道解釋是否令人滿意?
-
我之前說的不是真的。
不能為陣列指標賦值,因為預設情況下陣列指標 str 為 const 型別。
例如: 變數定義為:
char *str[3];
它可以是這樣的:str[0] = malloc(sizeof(char[3])))。
str[1] = ..
不知道解釋是否令人滿意?
-
X-length 表面的長度是一樣的,strlen 也是如此。
但是 x 會自動新增乙個 0 作為字串的終止符,因此它在記憶體中比 y 長。
-
x 是乙個字串,末尾有它'\0'
y 是字元陣列。
兩者不容易比較。
從記憶體的角度來看,x 有 5 個元素,占用 6 個位元組。
y 中儲存了 5 個元素,占用 5 個位元組。
-
char x=”12345”;這麼久...編譯系統會自動附加乙個字串結尾。
-
char rp[100] 定義了乙個 100 個字元的陣列,在編譯或執行程式時分配了 100 個字元空間。
char *rp;定義乙個指向字元的指標,當程式編譯或執行時,它會分配乙個指標空間,在 32 臺機器上通常為 4 個位元組。
也可以合理地說,自動分配也是有爭議的。
在空間分配方面,這就是記憶體管理。
通常有兩種情況,一種是靜態分配,由編譯器和系統自動分配
正如我們通常定義的那樣,int a; 這也分為兩種情況。
如果 int a; 定義為全域性變數,則 a 將位於系統為程式分配的空間中。
如果 int a; 在函式中定義,則 a 將位於程式的堆疊中。
另一種是動態分配,程式在執行時向系統請求記憶體操作。 主要目的是更好、更靈活地管理記憶體。
當你執行這個操作時,RP執行的記憶體是0,並且沒有分配,所以你當然不能使用這個記憶體。
應該說RP指向的記憶是非法的。
儘管 rp=0 被視為初始化操作,但如果未為 RP 分配實際可用位址值,則 RP 不能用作指標,並且無法訪問其位址。
p = tmp;這並不是說 P 複製了 TMP 陣列,只是 P 中的值成為 TMP 的位址(P 指向 TMP)。 你可以把 p 看作是 tmp 的別名,就像乙個人有兩個名字,但無論如何,只有乙個人。
初始化工作指標變數的唯一方法是為其分配乙個有效的記憶體位址,即記憶體請求函式返回的記憶體位址或現有記憶體位址。 我們總是最終為這個指標變數分配乙個有效的記憶體位址。
int *p,*k,v;
p=malloc(sizeof(int));
k=&v;k=p;
這些只是形式上的差異,無論如何,其中乙個可用的指標必須指向合法位址。
-
宣告陣列為將儲存在陣列中的資料分配記憶體,而宣告指標僅分配一段記憶體來儲存它稍後指向的記憶體的位址。
-
陣列本身被編譯,系統為其分配記憶體。 指標只是乙個指向記憶體片段的位址變數。
-
如果定義為 char rp[100],編譯器會在堆疊上為陣列變數 rp 分配 100 位元組的記憶體;
如果定義為 char*rp,則編譯器為堆疊上的指標變數分配 sizeof(char*) 大小的記憶體,通常為 4 個位元組; 要使 RP 有效,RP 指標必須指向有效的記憶體位址,在這種情況下,您可以在堆上為其分配額外的記憶體,或指向另乙個字串。
-
陣列空間是靜態分配的(即,在編譯之前有空間),並且指標在不指向任何記憶體的情況下宣告; 無法為其引用的記憶體分配值;
你可以這樣做。
#include
#include
#include
void main()
elseprintf("p=[%s] len=[%d]", rp, len);
free(rp);釋放 rp} 引用的記憶體空間我上面錯了,如果指標在宣告時沒有初始化,它都指向同乙個記憶體:
0xcccccccc(十六進製)。
而且這塊內存在系統中是不可寫的(就是不能分配),是的,其實有兩種方式。
1. 動態分配記憶體。
2. 為指標變數賦值。
-
2 的二進位程式碼是 =10;
2+x = 10+10100111 = 10101001 = 轉換為十進位 = 169;
3(3 的否定)= -4
169 4(按位異或運算)= -171
-
二進位表示。
85(十進位)。
-
如果 char x[2][10] = ; 字元 x[0][10] 等於什麼?
答:沒有等待,重複定義陣列 x。
如果 char y[2][3][10] = ,} 那麼 char y[2][3][10] 是什麼?
答:沒有,原理同上。
char y[2][2][10]=?
char y[1][1][10]=?
char y[1][2][10]=?
char y[0][0][10]=?
char y[0][0][0]=?
答:這五個是宣告三維陣列,但正確的表達是錯誤的,不是嗎? ,用 {} 或 “” 括起來。
-
字元 x[0][10 是 w;
char y[0][0][10]=w
char y[0][0][0]=h
僅在 y[1][1][2] 之前才有值。
陣列包含字母。
-
v 是乙個聯合(commoner)變數,它有兩個元素,x 和 c,它們都需要乙個位元組,並且它們被分配給同乙個位址。 x 是乙個結構變數,有三個元素,s1、s2 和 s3,分別佔 2、3 和 3 位數字。 分配記憶體時,最低的位在前,最多的位在後。
當二進位檔案為01100100)時,變數與記憶體儲存之間的關係如圖所示。
其中 x 的成員 s3 是二進位 011,即十進位 3,因此輸出為 3。
-
這屬於你的位元域問題! X 和 c 在聯合中共享乙個記憶體空間,這就是為什麼聯合一次只能儲存一種資料型別的值。
也就是說,結構變數 x 中三個欄位的記憶體值為 100
100 01100100的二進位位。 (高位元組->低位元組)而一般的機器是小的endea,即低位元組先,所以S3占用3位011輸出為 3
-
既然我們可以通過申請 1 位元組的記憶體來使用它背後的記憶體,為什麼我們要在 malloc 中新增 size 引數呢?
1.請求1位元組記憶體,可以使用p+1,但極有可能在執行時造成記憶體衝突。 作業系統管理記憶體,知道哪些可用,哪些不可用。 當我們使用 malloc 申請記憶體時,我們需要給 malloc 新增乙個 length 引數,告訴作業系統這個記憶體已經用完了,其他程式不能用了。
從這個角度來看,char *p = (char *)malloc(sizeof(char)); 在那之後使用 p+1 是錯誤的。
-
例如,在同一樓層,如果 P 是 3200,那麼 P+1 就是 3201P,指的是位址
回覆 2 樓和 3 樓,即使只應用了乙個 char 但 p+1 仍然有效,即使這裡定義了 int 型別,p+1 仍然指向下乙個,仍然可以呼叫,因為之前的定義是 char *p....
sizeof(char)中填寫什麼與返回的型別無關,填寫char返回1,填寫int返回2....然後用 malloc 開啟空間,然後強制轉換為 char* 型別。
-
由於 malloc 只申請了乙個 char 空間,所以你只給 p 分配了空間,而 p+1 是無效的。
您可以在 sizeof 之前乘以 n(數字)以請求多個空格。
-
指向空格的下乙個位元組。
-
指向 p 指向的空間的下乙個位元組,因為 char 只占用乙個位元組!
-
一次複製乙個字元。
for(int i = 0; i <3;i++)