簡體   English   中英

簡短快速的malloc內存訪問問題

[英]Short & Quick malloc memory access issue

#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;
}

所以問題如下:我可以根據需要多次運行此代碼,當它讀回數組時,我會得到完全隨機的結果,當涉及到存儲的位置。 示例:如果輸入為“foo bar is great”,則會輸出以下任意組合:“0處的值是1處的條形值是2處的條形值是3處的值是很大的值是foo”

一個更大的計划的一部分,但這是我正在努力尋找解決方案(或適當的實施)的概念。 :(我搜索谷歌的高低,以及這個網站,沒有正常工作的解決方案。任何幫助表示贊賞!

該程序是錯誤的並且有內存泄漏。

例如在本聲明中

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;
}

結果與前面的程序相同。 然而,在這種情況下,僅分配一個二維陣列,分配幾個一維陣列。

在實際打印之前,您可以釋放每個單詞。 您需要做的是最后(即在打印之后 - 可以在打印循環中)

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

並刪除free(word); 在第一個循環中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM