C 为什么我在将整数复制到一个新的动态数组时会得到奇怪的值?

C 为什么我在将整数复制到一个新的动态数组时会得到奇怪的值?,c,malloc,sizeof,C,Malloc,Sizeof,我用C编写了一个函数,将一个int数组中的所有素数复制到一个大小相同的新动态数组中 这是函数: int *cpy(int arr[], int size){ int *newArr = malloc(size * sizeof(int)); for (int i = 0; i < size; i++) { if (isPrime(arr[i])) { *(arr + i) = arr[i]; } } r

我用C编写了一个函数,将一个int数组中的所有素数复制到一个大小相同的新动态数组中

这是函数:

int *cpy(int arr[], int size){
    int *newArr = malloc(size * sizeof(int));
    for (int i = 0; i < size; i++) {
        if (isPrime(arr[i])) {
            *(arr + i) = arr[i];
        }
    }
    return newArr;
}
注意
SIZE
是一个宏,在我用来存储所有原型/宏的头文件中定义为20

出于某种原因,我得到以下输出:

Question 4: 12261328 12255424 285212761 39925 33619971
我不明白我做错了什么。我对C比较陌生,所以我为愚蠢的错误感到抱歉

编辑:我尝试了第一个评论解决方案,但得到:

Question 4: 129 6684864 87 33150 923

您需要在循环中添加第二个索引:

int* cpy(int arr[], int size){
        int* newArr = malloc((size + 1) * sizeof(int));
        for (int i = 0, j = 0; i < size; i++){
              if (isPrime(arr[i])){
                    *(newArr + j) = arr[i];
                     j++;
               }
         }
         newArr[j] = 0; // add a NULL at the end
         return newArr;
  }
int*cpy(int-arr[],int-size){
int*newArr=malloc((大小+1)*sizeof(int));
对于(int i=0,j=0;i
如果不这样做,那么内存中将保留一个未初始化值的数组

例如:

输入:1 3 6 9 13

输出:1 3 72742729 92652729 13

原因:跳过了6和9,留下了一个垃圾值。

int*cpy(int arr[],int size){
int* cpy(int arr[], int size){
    int* newArr = malloc(size * sizeof(int));
    for (int i = 0; i < size; i++){
        if (isPrime(arr[i])){
            *(arr + i) = arr[i]; // <---------------- ? why you use arr here?
        }
    }
    return newArr;
}
int*newArr=malloc(size*sizeof(int)); 对于(int i=0;i*(arr+i)=arr[i];//您的行为未定义,因为
cpy
函数不向目标数组写入任何内容:
*(newArr+j)=arr[i];
只将
arr[i]
复制到自身

还有一个问题:您只复制了一些条目,因此应该为目标数组使用单独的索引,并更改函数原型以返回存储在那里的元素数

以下是修改后的版本:

#包括
#包括
intisprime(intn){
如果(n%2==0)
返回n==2;
对于(int i=3;i+=2){
int quo=n/i;
int rem=n%i;
如果(quo
*(arr+i)=arr[i];
->
*(newArr+i)=arr[i];
我试过了,但我得到了
问题4:129 6684864 87 33150 923
您需要第二个索引来跟踪添加到
newArr
中的条目。您需要告诉调用方添加了多少条目。我不确定您的意思。
void printIntArr(int*arr)
使用
SIZE
,它在我的头文件中定义为8。它知道接收到的数组的大小,但新数组中的元素看起来像垃圾值。是的,但是您的
newArr
不一定要用
SIZE
值填充。函数的整个要点是只用素数值填充它。因此,根据定义它可能包含比原始数组更少的值。此外,出于类似原因,您不能将
i
用作
newArray
的索引,因为并非所有这些索引都将用于新数组。最终的
newArr[j]=0;
如果
arr
中的所有值都是prime,则将具有未定义的行为。您应该分配一个额外的条目来避免这种情况:
int*newArr=malloc((size+1)*sizeof(int));
不清楚如何将新数组中的条目数传递回调用方。
int* cpy(int arr[], int size){
    int* newArr = malloc(size * sizeof(int));
    for (int i = 0; i < size; i++){
        if (isPrime(arr[i])){
            *(arr + i) = arr[i]; // <---------------- ? why you use arr here?
        }
    }
    return newArr;
}
int* cpy(int arr[], int size){
    int* newArr = malloc(size * sizeof(int));
    memset(newArr, 0, sizeof(size * sizeof(int)); // <----- initialize newArr
    for (int i = 0; i < size; i++){
        if (isPrime(arr[i])){
            *(newArr + i) = arr[i]; // <--- ? I think you want to use newArr here
        }
    }
    return newArr;
}