[英]I keep getting segmentation fault
I need to add the 3 arrays, called vetor1
, vetor2
, vetor3
, to a big array called conjunto
, but I keep getting the segmentation fault when I run the code. 我需要将三个数组vetor1
, vetor2
, vetor3
到一个名为conjunto
的大数组中,但是在运行代码时,我总是遇到分段错误。
I use the function iniciaiza
to create a 50 position array and to fill this array with 0. Then, in the function read
, I will read a array (most times the size of the array will be 3) and in the function add, I need to copy the three arrays to the one that I created using malloc
. 我使用函数iniciaiza
创建一个50位置的数组,并用0填充该数组。然后,在read
函数中,我将读取一个数组(大多数情况下,数组的大小为3),然后在add函数中,我需要将三个数组复制到我使用malloc
创建的数组。 In the end I need to print the three arrays and the one with the copy of all the three. 最后,我需要打印三个数组,并打印所有三个数组的副本。
#include <stdio.h>
#include <stdlib.h>
int *conjunto;
int *vetor1, *vetor2, *vetor3, n1, n2, n3;
int tam = 50;
void inicializa (int **tconj, int tam)
{
int i;
*tconj = (int *) malloc (tam * sizeof(int));
for (i = 0; i < tam; i++)
{
tconj[i] = 0;
}
}
void read (int **vec, int *n)
{
int i;
printf("size of array: ");
scanf ("%d", n);
printf("array: \n");
*vec = (int *) malloc (*n * sizeof(int));
for (i = 0; i < *n; i++)
{
scanf ("%d", &(*vec)[i]);
}
}
void add (int *conjunto, int *vetor1, int *vetor2, int *vetor3, int n1, int n2, int n3)
{
int i, j, k, w;
int fim1 = (n1 + n2);
int fim2 = (n1 + n2 + n3);
for (i = 0; i < n1; i++)
{
conjunto[i] = vetor1[i];
}
for (j = n1; j < fim1; j++)
{
conjunto[j] = vetor2[j];
}
for (k = fim1; k < fim2; k++)
{
conjunto[k] = vetor3[k];
}
}
void print_array (int *vec, int n)
{
int i;
printf("array: ");
for (i = 0; i < n; i++)
{
printf("%d ", vec[i]);
}
printf("\n");
}
int main()
{
inicializa (&conjunto, tam);
read (&vetor1, &n1);
read (&vetor2, &n2);
read (&vetor3, &n3);
print_array (vetor1, n1);
print_array (vetor2, n2);
print_array (vetor3, n3);
add (conjunto, vetor1, vetor2, vetor3, n1, n2, n3);
print_array (conjunto, tam);
return 0;
}
Your initialization function is almost good, just a small star is missing: 您的初始化功能几乎不错,只是缺少一颗小星星:
void inicializa (int **tconj, int tam)
{
int i;
*tconj = (int *) malloc (tam * sizeof(int));
for (i = 0; i < tam; i++)
{
(*tconj)[i] = 0;
}
}
Also you should call it in your main after reading input this way: 同样,您应在以这种方式读取输入后在主目录中调用它:
tam = n1 + n2 + n3;
inicializa (&conjunto, tam);
And at end of program, before the return
, you should add: 在程序结束时,在return
之前,您应该添加:
free(conjunto);
free(v1);
free(v2);
free(v3);
Edit: I missed two other bugs in add()
. 编辑:我错过了add()
其他两个错误。
void add (int *conjunto, int *vetor1, int *vetor2, int *vetor3, int n1, int n2, int n3)
{
int i, j, k;
int fim1 = (n1 + n2);
int fim2 = (n1 + n2 + n3);
for (i = 0; i < n1; i++)
{
conjunto[i] = vetor1[i];
}
for (j = n1; j < fim1; j++)
{
conjunto[j] = vetor2[j - n1];
}
for (k = fim1; k < fim2; k++)
{
conjunto[k] = vetor3[k - fim1];
}
}
Edit 2: Also it won't work if user add funny values (such as zero or negative size arrays), I leave those controls to you. 编辑2:如果用户添加有趣的值(例如零或负大小数组),也将不起作用,我将这些控件留给您。
In your function add
you are reading vetor2[j];
在你的函数add
你正在阅读vetor2[j];
and vetor3[k];
和vetor3[k];
but j
and k
can be out of bound of the vetor
但是j
和k
可能超出vetor
for (i = 0; i < tam; i++)
{
// This is not doing what you think it is.
// You are setting some memory locations at and after tconj to zero,
// which is not the array you just allocated.
// The pointer to array that you just allocated is now 0
tconj[i] = 0; // pretty sure you mean *tconf[i]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.