C中指针的问题,找不到我的错误

时间:2015-03-22 11:07:47

标签: c arrays pointers

我已经在这2天工作了,找不到我的错误,程序运行但是在我输入3或4后它停止(等待)。任何人都可以帮助我,我的错误在哪儿?

该计划应该做到以下几点:

将询问用户他想输入多少个号码(3或4)。 将从用户输入3或4个整数值并保存在数组中。 该程序计算用户输入的零数。 然后程序将数组加倍到双倍大小,其中每个元素旁边都有一个副本。 最后打印出新阵列。

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

static int cnt = 0;


/* Read <cnt> Integers into given array.
Return number of entered zeros */
int* readInts(int *arr) {
    int i=0, *zeros = (int*)malloc(sizeof(int));

    while(i <= cnt) {
        scanf("%d", arr++);
        if (arr[i++] == 0) *zeros++;
    }
    return zeros;
}

/* Create "double-sized" copy of array (duplicate each value)*/
void extend(int *arr, int *newarr) {
    int i,j;
    newarr = (int*) malloc(2 * cnt * sizeof(int*));
    for (i=0,j=0; i <= cnt; i++) {
        newarr[j++] = arr[i];
        newarr[j++] = arr[i];
    }
}

int main(void) 
{
    int arr[4], *zeros, i;
    printf("How many integers (3 or 4)?\n");
    scanf("%d", &cnt);

    zeros = readInts(arr); 
    printf("You entered %d zero(s)!\n", *zeros);

    int *newarr;
    extend(arr, newarr);

    for (i=0; i < cnt*2; i++) printf("%d ", newarr[i]);
    printf("\n");

    return 0;
}

1 个答案:

答案 0 :(得分:1)

这是因为你应该使用while(i <= cnt) while(i < cnt)(两次)。

但在那之后,你会遇到分段错误 在为其分配值之前,您将newarr传递给extendextend内部为您分配一个值,但这不会在函数外部发生变化,因此您(很可能)会在printf("%d ", newarr[i]);上遇到分段错误。 另外,您应该在int*中将int替换为malloc(2 * cnt * sizeof(int*));。 但是为了避免分段错误,你有两个简单的选择(其中有更复杂的选项):

  1. 在将newarr传递给extend之前初始化int *newarr = (int*) malloc(2 * cnt * sizeof(int));
    void extend(int *arr, int *newarr)
  2. 更改int* extend(int *arr)
    return newarr;结尾处extend和{{1}} {。}}。{/ li>