1

我已经初始化了一个 char** 并在循环中使用 malloc 分配了空间

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[i]);

那么我怎样才能让它指向它的原始位置呢?160从哪里来?

提前致谢

4

2 回答 2

1

永远不要假设两个分配的内存块应该“通常”在内存中相邻。可能附有分配器“簿记”数据;它们可以被填充以在某些块大小处对齐以提高效率;他们可能在各种随机位置使用先前分配的内存。

当你说:

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 */
于 2014-02-21T02:22:26.300 回答
1

为了您的使用,您应该考虑静态内存分配。在动态分配中,您不能做出相同的假设。此外,在打印内存地址时,您可能会发现以十六进制读取值更容易。如果是这样,则使用 %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;
}
于 2014-02-21T02:46:52.713 回答