我想将数组指针传递给一个函数,然后malloc和realloc。该功能结束,但在我返回主服务器之前出现分段错误(核心转储(错误之后。
我对C指针不太熟悉,我主要使用C++作为我的代码,不知道如何使用指针作为参考。
主要:
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
int main(){
int A[]={1,2,4,5,7};
int B[]={1,2,3,4,6,8};
int *C=NULL;
int k=0;
egyesit(A,B,C,5,6,&k);
int i;
for (i = 0; i < k; i++)
{
printf("%d ", C[i]);
}
printf("n");
return 0;
页眉:
void egyesit(int *A, int *B, int *C, int n,int m,int *k);
不同 c 文件中的函数:
#include <stdio.h>
#include <stdlib.h>
void egyesit(int *A, int *B, int *C, int n, int m, int *k)
{
int i, j;
C = (int *)malloc(n * sizeof(int));
*k = n;
for (i = 0; i < n; i++)
{
printf("%d ", A[i]);
C[i] = A[i];
}
printf("n");
for (i = 0; i < *k; i++)
{
printf("%d ", C[i]);
}
printf("n");
int ok;
for (i = 0; i < m; i++)
{
ok = 1;
printf("%d ", B[i]);
for (j = 0; j < *k; j++)
{
if (C[j] == B[i])
{
ok = 0;
break;
}
}
if (ok == 1)
{
*k=*k+1;
C = (int *)realloc(C, *k * sizeof(int));
C[*k - 1] = B[i];
}
}
printf("n");
for (i = 0; i < *k; i++)
{
printf("%d ", C[i]);
}
printf("n");
}
要为C
分配malloc
或realloc
momory,您必须将其地址传递给函数。所以你的函数应该是:
void egyesit(int *A, int *B, int **C, int n,int m,int *k)
否则,在egyesit
中分配的指针将不会在main
中声明的变量C
中设置。
所以你的函数变成这样:
void egyesit(int *A, int *B, int **C, int n, int m, int *k)
{
int i, j;
*C = (int *)malloc(n * sizeof(int));
*k = n;
for (i = 0; i < n; i++) {
printf("%d ", A[i]);
(*C)[i] = A[i];
}
printf("n");
for (i = 0; i < *k; i++) {
printf("%d ", (*C)[i]);
}
printf("n");
int ok;
for (i = 0; i < m; i++) {
ok = 1;
printf("%d ", B[i]);
for (j = 0; j < *k; j++) {
if ((*C)[j] == B[i]) {
ok = 0;
break;
}
}
if (ok == 1) {
*k = *k + 1;
*C = (int *)realloc(*C, *k * sizeof(int));
(*C)[*k - 1] = B[i];
}
}
printf("n");
for (i = 0; i < *k; i++) {
printf("%d ", *C[i]);
}
printf("n");
}
然后你以这种方式从main
调用它:
egyesit(A, B, &C, 5, 6, &k);
或者你可以只返回一个指向函数中分配的内存的指针,eyesgit()
如
int *egyesit(int *A, int *B, int *C, int n, int m, int *k)
{
int i, j;
C = malloc(n * sizeof(int));
....
....
....
return C;
}
而在main()
,
C=egyesit(A,B,C,5,6,&k);
但是一旦你完成了使用它,不要忘记释放内存,就像
free(C);
不需要显式强制转换malloc()
的返回值。阅读这篇文章。
malloc()
如果出现内存不足等错误,realloc()
将返回NULL
。您可能还想检查一下。
分段错误在您的函数中 egyesit 在第一个 for 循环中
*C[i] = A[i];
这是因为您像这样分配了变量 C
*C = (int *)malloc(n * sizeof(int));
C 是 int 上的指针上的指针... int **C
所以你应该首先像这样分配内存
C =(int**)malloc(sizeof(int*));
之后,为 C 指向的 int 类型的数组分配内存
//*C meaning you are dereferencig on what C is pointing, and allocate memory for that
*C=(int*)malloc(sizeof(int)*n));
这就是它应该的样子
void egyesit(int *A, int *B, int *C, int n, int m, int *k)
{
int i, j;
C = (int **)malloc(sizeof(int*));
*C = (int*)malloc(sizeof(int)*n);
*k = n;
for (i = 0; i < n; i++)
{
printf("%d ", A[i]);
C[i] = A[i];
}
printf("n");
//and the rest of the function