【问题标题】:C char*, char**, char***, printing and freeing troubleC char*, char**, char***, 打印和释放麻烦
【发布时间】:2016-03-02 11:37:40
【问题描述】:

我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的单词做一个 free() ,但是这个 free 让我的程序崩溃了。

int main
{
    printf("Introduce how many words do you want. \n");
    scanf("%d", &numWords);
    getchar();

    char ***array = (char***)malloc(sizeof(char**) * numWords);

    if (array == nullptr)
    {
        exit(1);
    } 

    for (int i = 0; i < numWords; i++) array[i] = (char**)malloc(sizeof(char*)) ;

    for (int i = 0; i < numWords; i++)
    {
        printf("Enter your word number %d: \n", i + 1);
        scanf("%s", &(array[i]));
        getchar();
    }

    for (int i = 0; i < numWords; i++)
    {
        printf("%s \n", &(array[i]));
    }

    free(array[1]);

    printWord(array[2])
}

另外,我想做这个功能,因为我想打印单词的每个字符,前面有一个空格。它也会让我的程序崩溃。

void printWord(char **array)
{
    for (int i = 0; i < strlen(*array); i++) printf("%c ", &((*array)[i]));
}

不知道如何集中注意力。你有什么推荐给我的?你发现我的代码有什么问题吗?谢谢。

【问题讨论】:

  • 我想你误解了scanf 的工作原理。
  • 将字符串视为char *,将字符串数组视为char **。现在想想在哪里,例如char *** 在这个方案中是有意义的。
  • @JoachimPileborg:告诉初学者char * 是一个字符串(或数组)是个坏主意。他们应该从一开始就知道指针和数组是不同的类型(而C没有特殊的string类型)。
  • C 没有 nullptr 关键字。它是 C++ 关键字。

标签: c pointers malloc free


【解决方案1】:

你把你的星星弄混了。它是这样工作的:

  • char*: 字符串
  • char**: 列表
  • char***: 列表 >

再次检查您的代码并检查每个 printf("%s" ...) 是否对应一个 char* 并且每个 printf("%c" ...) 是否对应一个 char。还要打开编译器中的所有警告,如果有任何好处,它应该在您将错误类型传递给 printf() 时警告您。

提示:您在 main 中的 array 变量应该是 char**,而不是 char***。

【讨论】:

    【解决方案2】:

    你需要char**,有很多问题和错误需要修复:

    • int main{} 至少应该是 int main(void){} 你需要 (void)
    • 不检查 scanf 是否有错误
    • nullptrc++ 关键字,应该是 NULL
    • 最重要的是你freemalloced。
    • casting malloc 并不总是一个好主意,please read this

    你的代码应该是这样的:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void){
        long unsigned int numWords,i;
        char **array;
    
        printf("Introduce how many words do you want:> ");
        if((scanf("%lu", &numWords)) != 1){
            printf("Error, Fix it!\n");
            exit(1);
        }
    
        array = malloc(sizeof(char*) * numWords * numWords);
    
        if (array == NULL)    {
            exit(2);
        }
    
        for (i = 0; i < numWords; i++){
             array[i] = malloc(sizeof(char*) * 100);
        }
    
        for (i = 0; i < numWords; i++){
            printf("Enter your word number %lu:> ", i + 1);
            if((scanf("%s", array[i])) != 1){
                printf("Error, Fix it!\n");
                exit(3);
            }
        }
    
        for (i = 0; i < numWords; i++){
            printf("%s \n", array[i]);
        }
    
        for (i = 0; i < numWords; i++){
             free(array[i]);
        }
        free(array);
    
        return 0;
    }
    

    输出:

    Introduce how many words do you want:> 3
    Enter your word number 1:> Michi
    Enter your word number 2:> aloha
    Enter your word number 3:> cool
    Michi 
    aloha 
    cool
    

    【讨论】:

    • 我认为array = malloc(sizeof(char*) * numWords * numWords);这一行应该是:array = malloc(sizeof(char*) * numWords);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多