我初始化了一个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来自哪里?
提前致谢
答案 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;
}