C 为什么我在将整数复制到一个新的动态数组时会得到奇怪的值?
我用C编写了一个函数,将一个int数组中的所有素数复制到一个大小相同的新动态数组中 这是函数: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
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;
}