C char *,char **,char ***,打印和解放麻烦

时间:2015-11-28 12:42:50

标签: c pointers malloc free

我正在学习如何在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]));
}

不知道如何关注这一点。你对我推荐什么?你在我的代码中发现了什么问题吗?谢谢。

2 个答案:

答案 0 :(得分:0)

你让你的星星混淆了。这是它的工作原理:

  • char *:string
  • char **:list&lt; string&gt;
  • char ***:list&lt;列表&LT;字符串&gt; &GT;

再次检查你的代码并检查每个printf(&#34;%s&#34; ...)是否对应char *并且每个printf(&#34;%c&#34; ...)对应到一个char。同时打开编译器中的所有警告,如果它有任何好处,它会在你将错误的类型传递给printf()时发出警告。

提示:main中的数组变量应该是char **,而不是char ***。

答案 1 :(得分:0)

您需要char**并且存在许多应该修复的问题和错误:

  • int main{}至少应为int main(void){} (void)
  • 不检查scanf是否有错误
  • {li> nullptr c++个关键字应为NULL
  • 最重要的是freemalloc编辑的方式。
  • 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