簡體   English   中英

C char **,字符串數組空指針

[英]C char**, string array null pointer

我已經在循環中使用malloc初始化了char **並分配了空間

char *argv[SIZE];  
for( i=0 ; i < SIZE; i++ ){
    argv[i] = (char *) malloc(64);
    printf("ADDRESS %d Index %d\n",argv[i],i);
}

printf顯示地址增加了160,而不是64,這正常嗎?

並說我將第二個索引指向了null

argv[1] = NULL;

他們試圖通過它使其指向已分配的內存位置

argv[1] = arg[0] + 64;

我嘗試釋放循環后使程序崩潰

自由(的argv [1]);

那么如何使其指向原始位置? 160是哪里來的?

提前致謝

永遠不要假設已分配內存的兩個塊在內存中應該“正常”相鄰。 可能有分配器“簿記”數據附加到它們; 可以填充它們以使其與某些塊大小對齊以提高效率; 他們可能在各種隨機位置使用先前分配的內存。

當你說:

argv[1] = arg[0] + 64;

您可能會說:

argv[1] = arg[0] + 1234534321;

這很可能是正確的。 如果要將argv[1]恢復為其原始值,請先保存該值,不要猜測它可能在哪里。

char *saveArgv1 = argv[1];
argv[1] = NULL;
argv[1] = saveArgv1;  /* now it's back to its old self */

在使用時,應考慮靜態內存分配。 在動態分配中,您不能做出相同的假設。 另外,在打印內存地址時,您可能會發現更容易讀取十六進制的值。 如果是這樣,請使用%p代替%d。

#include <stdio.h>

#define SIZE 10

static char argv[SIZE][64];

int main()
{
    int i;  
    for( i=0 ; i < SIZE; i++ ){
        printf("ADDRESS %p Index %d\n",argv[i],i);
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM