gpt4 book ai didi

c - 简短快速的 malloc 内存访问问题

转载 作者:行者123 更新时间:2023-12-01 13:46:59 24 4
gpt4 key购买 nike

#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”,它会输出以下任意组合“value at 0 is bar value at 1 is bar value at 2 is great value at 3 is 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;
}

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

关于c - 简短快速的 malloc 内存访问问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35252633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com