【问题标题】:read indefinite amount of integers until one is negative and then print them读取无限数量的整数,直到一个为负数,然后打印它们
【发布时间】:2020-02-16 16:00:33
【问题描述】:

我是指针新手,所以我尝试发明这个简单的问题。为什么它不工作?除了说我犯了什么错误,如果你们能告诉我这种方法的替代方法,我将不胜感激

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int *p;
    int i, j;
    i = 0;
    p = (int *)malloc(sizeof(int) * (i + 1));
    scanf("%d", p);
    do {
        i++;
        p = realloc(p, sizeof(int) * i);
        scanf("%d", (p + i));
    } while (*(p + i) > 0);

    for (j = 0; j < i; j++) {
        printf("%d\n", *(p + j));
    }
    free(p);
    return 0;
}

【问题讨论】:

  • p=realloc(p,sizeof(int)*i);将分配一个“i”整数的缓冲区。下面的 scanf 将在 p+I 处存储一个值,该值不在分配的缓冲区的末尾。

标签: c loops pointers memory-management


【解决方案1】:

此声明

p=(int *)malloc(sizeof(int) * (i+1));

是多余的。最好写

p = NULL;

并且在调用 scanf 时使用 int 类型的对象而不是指针。

如果例如第一个输入的值为负数,则可能存在冗余内存分配

在本次通话中

    scanf("%d", (p+i));

存在超出分配内存的访问。你至少应该写

    scanf("%d", (p + i -1));

最好在这个语句中指定一个中间指针

    p=realloc(p,sizeof(int)*i);

因为函数可以返回NULL。在这种情况下,之前分配的内存地址将会丢失。

以及循环中的条件

}while(*(p+i)>0);

不检查该值是否为负数。

程序可以如下所示

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    int *p = NULL;
    size_t n = 0;
    int value;

    for ( int *tmp;  
          scanf( "%d", &value ) == 1 &&
          !( value < 0 ) &&
          ( tmp = realloc( p, ( n + 1 ) * sizeof( int ) ) ) != NULL; 
          ++n )
    {
        p = tmp;
        *( p + n ) = value;
    }                      

    for ( size_t i = 0; i < n; i++ )
    {
        printf( "%d ", *( p + i ) );
    }

    putchar( '\n' );

    free( p );

    return 0;
}

如果进入

0 1 2 3 4 5 6 7 8 9 -1

程序输出将是

0 1 2 3 4 5 6 7 8 9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多