提问人:HamzaKerem 提问时间:5/21/2020 最后编辑:Karl KnechtelHamzaKerem 更新时间:5/21/2020 访问量:123
C - 尝试将指向函数的指针作为参数传递时出错,无法获取值
C - Error when trying to pass a pointer to a function as an argument, can't get value
问:
我无法将指向函数的指针作为参数传递,同时能够成功显示指向的值。函数 checkIfPrime 将不起作用,也不会接收指针 pAr 指向的值。对不起,代码混乱。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
int calculatePrime(){
int i = 0, j = 0, z = 0, check = 0;
int prime[100] = {2, 3, 5};
int size = 3, primeNum = 7;
int *pAr = prime;
while (i <= 100){
for (z = 0; z <= size - 1; z++){
if (primeNum % prime[z] != 0){
check++;
}
}
if (check == size){
prime[size] = primeNum;
size++;
}
i++;
primeNum += 2;
check = 0;
}
return pAr;
}
int checkIfPrime(int *pAr, int num){
int i, check = 0, isPrime = 0;
int fail = 0;
printf("\n\n");
printf("Doesn't works here, *(pAr + 5): %d", *(pAr + 5));
for(i = 0;i <= 45 && fail == 0; i++){
if (num % *(pAr + i) != 0){
check++;
}
else{
fail = 1;
}
}
if (check == 45){
isPrime = 1;
printf("\n%d is prime\n", i);
} else{
isPrime = 0;
printf("\n%d is not prime\n", i);
}
return isPrime;
}
int main(){
FILE *fp = NULL;
fp = fopen("test.txt", "r");
int i = 0, j = 0, k = 0;
int even[20], odd[20], prime[20];
int num, temp;
char str[20];
int isPrime;
int ar[45];
int *pAr;
pAr = calculatePrime();
printf("Works here, *(pAr + 5): %d\n", *(pAr + 5));
isPrime = checkIfPrime(&pAr, 7);
//Having issues here
return 0;
}
答:
2赞
Daniel Walker
5/21/2020
#1
calculatePrime
在其本地堆栈上创建一个数组 。从此函数返回的指针 是此数组的地址。但是,函数返回后在堆栈上分配的数据状态应被视为不确定的。也就是说,不能保证在退出后,引用的数据不会被损坏。int
prime
pAr
calculatePrime
pAr
如果要创建数据并从函数返回指向该数据的指针,则需要使用类似 的函数动态分配适当的空间。malloc
评论
0赞
HamzaKerem
5/21/2020
我已为指针 pAr 分配了内存,如下所示:pAr = (int*)malloc(45 * sizeof(int));但是,我仍然无法让它正常工作
0赞
Daniel Walker
5/21/2020
你还在传给吗?&pAr
checkIfPrime
0赞
HamzaKerem
5/21/2020
我是,我在调用函数calcualtePrime和checkIfPrime之前分配了它。
0赞
Daniel Walker
5/21/2020
但以 an 作为参数,但是一个 .checkIfPrime
int*
&pAr
int**
上一个:请帮我澄清C++按值传递?
评论
#include
gcc
-Wall -Wextra -Wconversion -pedantic -std=gnu11
malloc()
stdlib.h
#include <malloc.h>
for
if
else
while
do...while
switch
case
default