#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 %sn",i,wordlist[i]);
}
free(wordlist);
return 0;
}
所以问题如下:我可以根据需要多次运行此代码,当它读回数组时,当涉及到存储内容的位置时,我会得到完全随机的结果。示例:如果输入是"foo bar 很棒",它将输出以下任意组合"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 %sn", 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 %sn", 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);