简短&快速malloc内存访问问题

时间:2016-02-07 11:01:58

标签: c arrays pointers multidimensional-array malloc

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char **wordlist=(char **)malloc(sizeof(char*)*4);
    for(int i=0;i<4;i++)
    {
        char *word=(char*)malloc(sizeof(char*)*20);;
        scanf("%s",word);
        wordlist[i]=word;
        free(word);
    }
    for(int i=0;i<4;i++)
    {
        printf("at %d value is %s\n",i,wordlist[i]);
    }
    free(wordlist);
    return 0;
}

所以问题如下:我可以根据需要多次运行此代码,当它读回数组时,我会在存储内容时获得完全随机的结果。示例:如果输入是&#34; foo bar很棒&#34;它会输出以下任意组合&#34;值为0是条形值1是条形值2是大值3是foo&#34;

一个更大的计划的一部分,但这是我努力寻找解决方案(或适当的实施)的概念。 :(我搜索谷歌的高低,以及这个网站,没有正常工作的解决方案。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

程序错误,内存泄漏。

例如在本声明中

char *word=(char*)malloc(sizeof(char*)*20);;
                         ^^^^^^^^^^^^^ 

使用sizeof( char * )代替sizeof( char )

然后在这些陈述之后

 wordlist[i]=word;
 free(word);

wordlist[I]将指向已删除的内存。

结果该程序有未定义的行为。

您需要的是以下内容

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

#define N   4
#define M   20

int main( void )
{
    char ( *wordlist )[M] = malloc( sizeof( char[N][M] ) );

    for ( size_t i = 0; i < N; i++ )
    {
        scanf( "%19s", wordlist[i] );
    }

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "at %zu value is %s\n", i, wordlist[i] );
    }

    free( wordlist );

    return 0;
}

例如,如果要输入

one two free four

然后输出看起来像

at 0 value is one
at 1 value is two
at 2 value is free
at 3 value is four

考虑到如果你的编译器支持可变长度数组,那么最右边的维度就不必是常量。

另一种方法是动态地将指针数组分配给一维字符数组的第一个元素。 例如

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

#define N   4
#define M   20

int main( void )
{
    char **wordlist = malloc( sizeof( char *[N] ) );

    for ( size_t i = 0; i < N; i++ )
    {
        wordlist[i] = malloc( sizeof( char[M] ) );
        scanf( "%19s", wordlist[i] );
    }

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "at %zu value is %s\n", i, wordlist[i] );
    }


    for ( size_t i = 0; i < N; i++ ) free( wordlist[i] );

    free( wordlist );

    return 0;
}

结果与前面的程序相同。然而,在这种情况下,只分配一个二维数组,分配了几个一维数组。

答案 1 :(得分:0)

在实际打印之前,您可以释放每一个单词。 您需要做的是最终(即在打印之后 - 可以在打印循环中)

for (i=0;i<4;i++)
   free(wordlist[i]);
free(wordlist) 

并删除第一个循环中的free(word);