我已经初始化了一个 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 从哪里来?
提前致谢
最佳答案
永远不要假设两个分配的内存块在内存中“通常”应该相邻。它们可能附有分配器“簿记”数据;为了提高效率,它们可能会被填充以在某些 block 大小上对齐;他们可能在各种随机位置使用以前分配的内存。
当你说:
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 */
关于C char**,字符串数组空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21923921/