【问题标题】:Why does dynamic array contain null instead of actual string为什么动态数组包含 null 而不是实际的字符串
【发布时间】:2021-07-30 16:40:53
【问题描述】:

首先,我不知道堆内存是否以连续的方式使用,这样做... while 循环,其次,当我尝试打印存储在数组中的字符串时,我得到的是 NULL 值而不是实际值字符串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma warning(disable : 4996)

int main() {
    int counter = 0;
    char** tab;
    do {
        tab = (char**)malloc(3 * sizeof(char));
        tab[counter] = (char*)malloc(256 * sizeof(char));
        fgets(*(tab + counter), 256, stdin);
        ++counter;
    } while (counter < 3);
    printf("%s", tab[0]);
    
}

【问题讨论】:

  • 除非你在一个非常奇怪的硬件架构上运行:访问对象边界之外的未定义行为。
  • 我正在使用在线 GCC 编译器
  • 您有大量内存泄漏。不仅来自字符串本身,还因为您在循环内为 tab 本身分配内存,丢弃了最后的分配(以及您刚刚读取的字符串)。
  • 至于你的问题,仔细看tab = (char**)malloc(3 * sizeof(char));的声明。您确定要为指针分配三个字节吗?
  • 哦...好吧,这就是问题所在。谢谢楼主:)

标签: arrays c dynamic


【解决方案1】:

根据代码,tab 应该是一个大小为 3 的字符串指针数组。但是至少有2个错误

  1. 您在每次循环迭代中分配一个新的数组副本
  2. 您只能为 3 个字符分配空间,而不是为 3 个指针分配空间。
    do {
        tab = (char**)malloc(3 * sizeof(char));

所以,你的代码应该是这样的:

tab = malloc(3 * sizeof(char*));
do {
...

在“c”中不需要转换为char**

下一行没问题:

        tab[counter] = (char*)malloc(256 * sizeof(char));

假设您对指针运算感到满意,这一行也可以。

        fgets(*(tab + counter), 256, stdin);

但是,它可以用不同的方式表达,更具可读性

        fgets(tab[counter], 256, stdin);

这是工作代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma warning(disable : 4996)

int main() {
    int counter = 0;
    char** tab = malloc(3 * sizeof(char*));
    do {
        tab[counter] = malloc(256 * sizeof(char));
        fgets(tab[counter], 256, stdin);
        ++counter;
    } while (counter < 3);
    printf("%s", tab[0]);
}

【讨论】:

  • 好吧,伙计,这是非常彻底的解释,我错过了二维数组只是指向特定类型数组的指针数组这一点。我只能说谢谢!我真的很感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多