[英]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.