C char **,字符串数组空指针

时间:2014-02-21 02:14:37

标签: c arrays char addressing

我初始化了一个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 [1]);

那我怎么能指出它原来的位置呢? 160来自哪里?

提前致谢

2 个答案:

答案 0 :(得分: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 */

答案 1 :(得分: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;
}