c - 递增指针时 C 错误中的 2D 动态分配

标签 c pointers dynamic-allocation

我想动态分配一个字符串数组,程序应该要求用户输入字符并将它们收集到数组的第一个字符串中,直到输入字母“q”,然后程序开始将字符添加到第二行等等。

当我打印字符存储位置时,似乎每个字符占用两个存储单元而不是一个,尽管我只增加了一次。

这是我的程序的源代码

#include <stdio.h>

void main()
{

    char** txt;
    char* baseAddress;

    txt = (char **)malloc(5*sizeof(char*));
    *txt = (char *)malloc(20*sizeof(char));

    baseAddress = *txt;


    while (*(*txt) != 'q')
    {
       (*txt)++;
       scanf("%c", (*txt));
       printf("%p\r\n", (*txt));
    } 

    *txt = '\0';

    printf("%p", baseAddress);

    free(baseAddress);
    free(txt);
}

输出是这样的

>j
>0x9e12021
>0x9e12022
>s
>0x9e12023
>0x9e12024
>

我认为指针可能有问题。 我该怎么做才能做到这一点?抱歉英语不好

最佳答案

您的代码具体做什么:

+----------------------------------------------+
|     +--------------------------------------+ |  
|  txt|*txt  |*txt+1 |*txt+2 |*txt+3 |*txt+4 | |
|     +--------------------------------------+ |
|       ^        ^    no memory alloc   ^      |
|       |        |_______not used_______|      |
|     +----+                                   |
|*txt |____|    <------------------------------+---you never give a value here,                            
| +1  |____|    <--j                           |
| +2  |____|    <-- '\n'                       |
| +3  |____|    <--s                           |
| +4  |____|    <-- '\n'                       |
|  .    .                                      |
|  .    .                                      |
|  .   ____                                    |
| +19 |____|                                   |
+----------------------------------------------+

所以你需要:

  1. 重写你的 while 循环并处理 '\n'
  2. 当用户输入q时,分配新的字符串内存并收集用户输入。

建议:

在你的第一个字符串中

使用 txt[0] 而不是 *txt ,使用 txt[0][i] 和 i++ 而不是 * *txt 和 (*txt)++ .

希望能有所帮助。 :-)

关于c - 递增指针时 C 错误中的 2D 动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18554757/

相关文章:

c++ - 动态分配的数组只显示最后的结果

c - 连续内存块的动态分配(malloc)

在结构中创建指向结构的指针数组

c++ - 想我应该被允许 `delete` 一个指针但是抛出错误 `block in use`

c++ - C++ STL::MAP 内部节点中存储了什么?

c - 使用函数将地址写入结构中的指针失败

CUDA 三重循环

c - 怎么了这让我发疯

c - 如何使用openmp并行化代码以减少添加矩阵和

创建一个初始化结构并返回指针的 C 函数