1樓:猿動力
#define new_string(p, n) p = (char *)malloc(n+1) //給字串分配記憶體的巨集定義
int main()
2樓:匿名使用者
然後你可以這樣引用: int** val =
c語言中,怎麼使用malloc函式為陣列指標分配空間 比如要為char *p[ ]分配空間,應該怎麼弄
3樓:
指標陣列和陣列指標是兩個不同概念,你這裡給出的定義例項實際上是指標陣列的定義。
指標陣列是指所定義陣列的每個陣列元素都是一個相應資料型別的指標,開設空間的操作可以應用迴圈語句進行,例如:對於char *p[10]; 可以應用
for(i=0;i<10;i++)
p[i]=(char *)malloc(sizeof(char)*n); //為每個指標申請開設n字元的儲存空間
開設後,對於p的使用與二維陣列的使用格式類似,可以有效的使用兩個下標,
如 p[0][0]='a';
還可以像每個指標中賦值字串: p[2]="beijing"; 當然字串長度應該小於n。
而陣列指標,是指定義為指向某個固定大小順序空間的指標,定義的格式如下:
char (*pa)[10]; //定義一個指向擁有10元素的字元陣列的指標,
int (*p)[10];
應用格式可以參考下述程式,申請空間、賦值、輸出後,可以觀察到100被賦值到第五行第十個元素,指標可以像二維陣列一樣通過兩個下標引用所申請開設的空間。
#include
main()}
c語言為字元指標(char*)分配動態記憶體空間(malloc),為什麼空間不發生變化 10
4樓:匿名使用者
char*是指標,你獲取指標(地址)的長度,32位機器當然是4。
c語言malloc分配出來的記憶體是不能通過sizeof獲取長度的。
c語言中幾個字串指標如何分配記憶體地址
5樓:鏡音雙子
在c語言中,可以用字元陣列或字串指標兩種方法儲存幾個字串,分配呢?很多教科書中未提到,下面舉例來討論。 例1.用字元陣列實現 main()strl一
c語言 malloc分配給字元指標記憶體,需不需要多分配一個給『\0』?
6樓:閥門資本
不需要,\0內部自動會分配的。按照位元組長度給指標分配記憶體即可
c語言指標申請空間問題(簡單)
7樓:匿名使用者
char c[80]; //你為c開設了80個位元組的儲存區來折騰
char *c; //你沒有開設儲存區,那麼如何或者說在**去倒騰字串呢?
char *a="i am"; //這裡雖然自己沒有開設空間,但是偷懶行為,是依賴系統的常數儲存區
char a="i am"; //或者寫char a[5]="i am";才是正常寫法,是自己開設的儲存區
不是自己開設的變數和儲存區操作起來容易出系統錯誤。
int a; int *p; p=&a; //雖然你在賦值階段沒有直接為p開設儲存區,但p=&a;實現了讓p指向自己開設
//的a變數儲存區來進行後續操作
連結串列中作為指標一定在使用前要確認指向自己程式開設的儲存區,否則就要出錯;移到下一個資料域時如果這個域你沒有申請儲存區那麼可以認為是不存在的,所以需要用malloc開儲存區
8樓:captainz鈥唊
這個你只要瞭解指標的用法你就明白了,指標是指向地址的一個資料型別 比如int b = 2; int *a = &b;那麼a就指向b所在的地址。最通俗的就是a是門牌號b是房子,吧a掛在b上你就可以通過a找到b;並且如果不限制你,你也可以進入這個房子修改裡面的東西。 回來說你上面的問題,如果換成
char *c;那麼c就是個門牌號,如果不用malloc申請空間,就相當於只有門牌號沒有房子,你通過c這個門牌號找到的房子不是你的,但是你還欺騙這些字串說這裡有房子,他們相信你了,他們進去了就和原來主人打架,然後就把房子拆了這就出錯了。malloc相當於給你自己建房子,你就可以合法居住了。每個門牌號都要有一個屬於自己的合法房子所以你說的移到下一個資料域時還要重新申請空間,是因為你的門牌號變了!!!!
9樓:匿名使用者
char c[80]; 作業系統執行時會給程式分配80byte的連續棧記憶體空間,如果寫成char *c 則只是一個指標而已,不會分配連續的空間以存放字串的。
而char * a = "blabla";
這裡的"blabla"位於呈程式的字串常量區,程式被裝入的時候就會分配地址。, char* a 也只是一個指標而已。
關鍵在於「分配地址空間」
10樓:匿名使用者
malloc申請記憶體空間是有風險的,如果內衣這麼個連續的記憶體空間,那麼申請記憶體空間就會報錯,用陣列最保險
在連結串列中,每個節點都必須重新申請記憶體空間,
11樓:匿名使用者
為指標申請存取資料的記憶體啊
c語言用動態儲存分配函式給指標分配空間,這個程式最終想實現的是原樣輸出使用者輸入的字元,請大蝦幫幫我!
12樓:匿名使用者
因為字串最後一位是'\0',這是系統預設的,所以只能輸出兩位數,也就是說*(str + k - 1)是'\0'。
如果想要輸出三位數的話,就多malloc一個位置。
#include
#include
int main()
printf("請輸入這些字元:\n");
//for(i=0;i // scanf("%c",str+i); scanf("%s",str); printf("這些字元是:"); for(i=0;i printf("%c",*(str+i)); free(str); return 0; }在上面的程式中,*(str + k)是'\0' 在c語言中一個指標佔用多少位元組。 13樓:blackpink_羅捷 一個指標變數在記憶體中佔兩個位元組(small模式編譯),一個指標變數在記憶體中佔四個位元組(32位機器上),一般都是32位機器的,所以四個位元組咯。 指標即為地址,指標幾個位元組跟語言無關,而是跟系統的定址能力有關。 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別、指標所指向的型別、指標的值或者叫指標所指向的記憶體區、指標本身所佔據的記憶體區。 擴充套件資料 1、指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各個指標的型別: (1)int*ptr;//指標的型別是int* (2)char*ptr;//指標的型別是char* (3)int**ptr;//指標的型別是int** (4)int(*ptr);//指標的型別是int(*) (5)int*(*ptr);//指標的型別是int*(*) 2、指標所指向的型別 當你通過指標來訪問指標所指向的記憶體區時,指標所指向的型別決定了編譯器將把那片記憶體區裡的內容當做什麼來看待。 從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉,剩下的就是指標所指向的型別。例如: (1)int*ptr; //指標所指向的型別是int (2)char*ptr; //指標所指向的的型別是char (3)int**ptr; //指標所指向的的型別是int* (4)int(*ptr); //指標所指向的的型別是int() (5)int*(*ptr); //指標所指向的的型別是int*()
14樓:哇哎西西 指標即為地址,指標幾個位元組跟語言無關,而是跟系統的定址能力有關。 比如以前是16位系統,指標即為2個位元組,現在一般是32位系統,所以是4個位元組。 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別、指標所指向的型別、指標的值或者叫指標所指向的記憶體區、指標本身所佔據的記憶體區。 擴充套件資料: 1、指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各個指標的型別: (1)int*ptr;//指標的型別是int* (2)char*ptr;//指標的型別是char* (3)int**ptr;//指標的型別是int** (4)int(*ptr)[3];//指標的型別是int(*)[3] (5)int*(*ptr)[4];//指標的型別是int*(*)[4] 2、指標所指向的型別 當你通過指標來訪問指標所指向的記憶體區時,指標所指向的型別決定了編譯器將把那片記憶體區裡的內容當做什麼來看待。 從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉,剩下的就是指標所指向的型別。例如: (1)int*ptr; //指標所指向的型別是int (2)char*ptr; //指標所指向的的型別是char (3)int**ptr; //指標所指向的的型別是int* (4)int(*ptr)[3]; //指標所指向的的型別是int()[3] (5)int*(*ptr)[4]; //指標所指向的的型別是int*()[4] 3、指標的值或者叫指標所指向的記憶體區或地址 指標的值是指標本身儲存的數值,這個值將被編譯器當作一個地址,而不是一個一般的數值。在32 位程式裡,所有型別的指標的值都是一個32 位整數,因為32 位程式裡記憶體地址全都是32 位長。 指標所指向的記憶體區就是從指標的值所代表的那個記憶體地址開始,長度為sizeof(指標所指向的型別)的一片記憶體區。以後,我們說一個指標的值是xx,就相當於說該指標指向了以xx 為首地址的一片記憶體區域。 我們說一個指標指向了某塊記憶體區域,就相當於說該指標的值是這塊記憶體區域的首地址。指標所指向的記憶體區和指標所指向的型別是兩個完全不同的概念。在例一中,指標所指向的型別已經有了,但由於指標還未初始化,所以它所指向的記憶體區是不存在的,或者說是無意義的。 4、指標本身所佔據的記憶體區 在32 位平臺裡,指標本身佔據了4 個位元組的長度。 15樓:舟 指標即為地址,它是一個 無符號整數(unsigned int), 它是一個以當前系統定址範圍為取值範圍的整數。 指標幾個位元組跟語言無關,而是跟系統的定址能力有關。 譬如以前是16為地址,指標即為2個位元組, 現在一般是32位系統,所以是4個位元組, 以後64位,則就為8個位元組。 擴充套件資料:1、在64位機器中: char型別佔1個位元組,short型別佔2個位元組int型別佔4個位元組,long型別佔4個位元組unsigned int型別佔4個位元組,float型別佔4個位元組double型別佔8個位元組。long double型別佔12個位元組2、記憶體分配表 計算機中的記憶體都是編址的,就像你家的地址一樣。在程式編譯或者執行的時候,系統(可以不關心具體是什麼,可能是編譯器,也可能是作業系統)開闢了一張表。每遇到一次宣告語句(包括函式的傳入引數的宣告)都會開闢一個記憶體空間,並在表中增加一行紀錄。 記載著一些對應關係。 3、c語言 c語言是一門通用計算機程式語言,廣泛應用於底層開發。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。 在c語言中並沒有bai 字串這個型別 du。所說的字zhi符串就是字元dao陣列。也就是char型別版的陣列。與普通陣列不同的,權字串必須以 0 作為結束符。而在c語言中,型別為t的一維陣列,其首地址等效於該型別的一維指標,即t 型。於是字串,也就是字元陣列,首地址就可以當做char 型使用了。事實... include int strlen char stry 函式strlen 的呼叫在宣告後,這一行可以省略 int strlen char stry 應該傳入一個字元指標,也就是你的一維陣列首地址 因為呼叫時是n strlen str str是一維陣列名,也是陣列首地址 main include i... 這裡的表達很不清楚。申請記憶體時實際就是從內 的堆 中,指定沒 有使用版的一塊區域來存權儲某個資料,區域的大小也就是位元組數在申請時已經傳遞給了記憶體申請函式,返回的指標就是這個區域的首地址。返回的指標賦值給某個變數,以後就可以通過這個指標變數來使用 儲存或者是讀取 所分配的這一塊記憶體區域了。所以...c語言中,為什麼字串可以賦值給字元指標變數
c語言程式設計符串長度,c語言程式設計 字串長度
c語言中,空指標申請了記憶體但未賦值,它還是空指標麼