該代碼(C語言)如何作業?我不明白那段代碼“char * op [30]”分配了多少記憶體。而且我也不知道在那種情況下記憶是如何組織的。我知道如何使用“malloc”分配記憶體,但下面的情況對我來說是模糊的。
int main(void) {
int n;
scanf("%i", &n);
char* op[30];
op[0] = "Hello, World"
op[1] = "Hello, World World World"
op[2] = "Hello, World World World World World World"
op[3] = "Hello, World World World World World World World World World..."
printf("%s\n", op[0]);
printf("%s\n", op[1]);
printf("%s\n", op[2]);
printf("%s\n", op[3]);
return 0;
}
uj5u.com熱心網友回復:
您將在堆疊上擁有一個長度為 30 的連續陣列。該陣列的每個元素都是一個 char* 指標。前 4 個指標每個都指向一個文字字串。其他條目未初始化
uj5u.com熱心網友回復:
恢復聲譽
char* op[30];在堆上分配。在這種情況下,您只需對編譯器說您將存盤 30 個指向 char 陣列的指標;當然@pm100是對的。char *op[30] 在堆疊上分配,因為它是一個陣列,所以它表示為一個實心記憶體塊- 另一方面,字串是靜態定義的,編譯器已經知道如何將它們放在記憶體中。
char *x; 確實如此。如果我們談論 MCU 的韌體,您的字串將被寫入閃存。在對 op[1] 的初始化程序中 - op[3] 分配字串的第一個元素的地址 - 把記憶體想象成一個鏈表;@pm100請糾正我,如果我錯了,但堆記憶體管理看起來像鏈表
- 將 1-3 個字串逐個匯總,當您為陣列的元素分配新值時,記憶體管理系統會搜索最后一個字串的結尾并將新字串放在它旁邊;忘記
- 您的代碼不安全。以這種方式定義的字串陣列沒有限制,并且資料可能會損壞;又錯了
- 當您使用時,
malloc您會告訴記憶體管理系統在堆上找到具有所需大小的實心記憶體塊。記憶體管理器,如果可能保留塊,將其添加到串列末尾(#2)并回傳一個指向該塊起始地址的指標。
玩的代碼:
#include <stdio.h>
#include <string.h>
int main(void)
{
char* op[30];
op[0] = "Hello, World";
op[1] = "Hello, World World World";
op[2] = "Hello, World World World World World World";
op[3] = "Hello, World World World World World World World World World...";
printf("mem:0xX >> %u - %u >> %s\n", op[0], 0, strlen(op[0]), op[0]);
printf("mem:0xX >> %u - %u >> %s\n", op[1], (op[1]-op[0]), strlen(op[1]), op[1]);
printf("mem:0xX >> %u - %u >> %s\n", op[2], (op[2]-op[1]), strlen(op[2]), op[2]);
printf("mem:0xX >> %u - %u >> %s\n\n", op[3], (op[3]-op[2]), strlen(op[3]), op[3]);
/* save pointer to op[1] */
char *tmp_string = op[1];
/* overrite op[1] */
op[1] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. ";
printf("mem:0xX >> %u - %u >> %s\n", op[0], 0, strlen(op[0]), op[0]);
printf("mem:0xX >> %u - %u >> %s\n", op[1], (op[1]-op[0]), strlen(op[1]), op[1]);
printf("mem:0xX >> %u - %u >> %s\n", op[2], (op[2]-op[1]), strlen(op[2]), op[2]);
printf("mem:0xX >> %u - %u >> %s\n", op[3], (op[3]-op[2]), strlen(op[3]), op[3]);
printf("TMP String: mem:0xX >> %s\n", tmp_string, tmp_string);
op[29] = "dolor sit amet, consectetur adipiscing elit";
printf("mem:0xX >> %u - %u >> %s\n\n\n", op[29], (op[29]-op[3]), strlen(op[29]), op[29]);
/* print mem layout */
for(int i = 0; i < 30; i ) {
printf("mem:0xX >> op[%u]\n", op[i], i);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439021.html
