我有这样的东西:
int n,m;
scanf("%d %d",&m,&n);
int *arr = malloc(sizeof(int)*n*m);
for(int i=0;i<m*n;scanf("%d",arr+i),i++);
现在说n = 2和m = 3,它接受前五个数字,并在第六个数字上给出分段故障。循环后我尝试立即打印东西,但没有打印,任何知道问题可能是什么?我已经广泛使用了类似的结构,并且从未遇到过问题。
编辑1:问题稍后是在程序中,但是事实是我在循环后立即有一个printf,但没有打印任何东西,所以我认为它必须在这里。printf为什么没有打印任何东西?它与并行执行有关吗?很抱歉,我的不熟悉堆栈溢出。
尝试这个,
int n,m;
printf( "Enter two digits" );
int scanCount = scanf( "%d %d", &m, &n );
if( scanCount < 2 ){
perror("Input");
exit(EXIT_FAILURE);
}
scanCount = 0;
size_t size = sizeof( int ) * n * m;
int * arr = (int *) malloc( size );
if ( arr == NULL ) {
perror("malloc");
exit(EXIT_FAILURE);
};
for( int i = 0; i < m * n; i++ ){
if ( scanf( "%d", arr + i ) )
scanCount++;
}
if( scanCount < m*n ){
perror("Input");
exit(EXIT_FAILURE);
}
for( int i=0; i<n*m; i++ ){
printf( "nValue at %d : %dn", i, *( arr + i ) );
}
我对上述程序进行了一些修改,现在对我有用。 malloc 函数期望" std :: size_t size"(我们还可以提供整数值)作为参数,这是我们需要分配的内存的大小。请访问http://en.cppreference.com/w/cpp/memory/c/malloc以获取任何参考。
我们还应该指定我们正在创建的内存的类型(否则它可能会在某些编译器中产生错误,例如"从'void*'到'int*'"的"无效转换")。在这种情况下,我们正在介绍整数数组,例如(int *)malloc(size)。
最好通过 scanf 实现一些错误的内存分配和输入(检查Malloc和Scanf的返回值)
我尝试在此处运行您的程序。没有错误。也许那是巧合,恰好碰巧运行,但是当您像这样打印循环中的值时,您会遇到错误?
如果是这样,那是因为在上次迭代期间,您尝试编写一部分内存的部分,该内存未分配给使用malloc()
。像arr[6]
一样,当仅在n = 2和m = 3时实际分配arr[5]
时。这样做会引起不确定的行为。查看评论中指出的链接@Basil。
您必须检查malloc()
返回的值,以查找内存分配是否成功。如果失败了,将返回NULL
。
可以检查scanf()
的返回值,以查找是否成功。它返回循环中scanf()
的成功分配数量必须为1
。如果不是1
发生了一些错误。
这是循环的另一种写作方式
for( i=0;i<m*n && scanf("%d", arr+i)==1;i++);