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

标签 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[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/

相关文章:

c - 有效计算闰日

c - 为什么要在宏中使用 'do {} while(0)'?

C程序划分错误?

c# - 数组作为函数参数 c 到 c# 的混淆

c# - 如何检查字符串的最后一个字符并查看它的空格

javascript - 使用 charCodeAt 转换时出现 NaN 错误

c - 有哪些内存地址空间?

javascript - 如何在 Javascript 中更新深度嵌套的对象?

ios - 如何将模型类字典中的值存储在 Array/NSMutableArray 中?

Java:如果用户输入 'y' | |'Y' 测验开始 ,'n' | |'N' 测验结束,休息时显示无效。我想当用户输入以 y 或 n 开头的单词时显示无效