我有类似的东西:
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打印不出任何东西?它与并行执行有关吗?抱歉格式不好,我是堆叠溢出的新手。
答案 0 :(得分:1)
试试这个,
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 : %d\n", i, *( arr + i ) );
}
我已经修改了上面给出的程序,现在它适用于我。 malloc 函数需要&#34; std :: size_t size&#34; (我们也可以提供整数值)作为参数,它是我们需要分配的内存大小。请访问http://en.cppreference.com/w/cpp/memory/c/malloc以获取任何参考。
此外,我们应该指定我们正在创建的内存的类型(否则它可能会在某些编译器中产生错误,例如&#34;无效转换为&#39; void *&#39;到&#39; int *&#39;&#34;)。在这种情况下,我们创建一个整数数组,例如,我们可以使用类型化 (int *)malloc(size)。
最好通过 scanf 为失败的内存分配和输入实现一些错误处理程序(检查malloc和scanf的返回值)
答案 1 :(得分:1)
我尝试运行您的程序here。没错。也许那是巧合而且刚好碰巧运行但是当你在this这样的循环中打印值时,你可能会遇到错误?
如果是这样,那是因为在上一次迭代期间,您尝试编写未分配给使用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++);