C语言 如何在函数中对数组进行 malloc,然后重新分配它



我想将数组指针传递给一个函数,然后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分配mallocreallocmomory,您必须将其地址传递给函数。所以你的函数应该是:

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

相关内容

  • 没有找到相关文章

最新更新