我正在使用函数扫描值。
int **array(int * counter) {
int **vrat;
int max = 5;
int index = 0;
int i;
vrat = malloc(max*sizeof(int*));
for ( i = 0; i < max ; i++) {
vrat[i] = malloc(2 * sizeof(int));
}
int x;
int y;
char c;
while (scanf("%d%c%d", &x, &c, &y) != EOF) {
vrat[index][0] = x;
vrat[index][1] = y;
index++;
}
*counter = index;
return vrat;
}
并在main中调用它以返回有效的数组。
int main()
{
int counter=0;
int **mej;
int gg;
mej = array(&counter);
int i;
gg = pocet(mej, &counter);
return 0;
}
什么困扰我的朋友&#34; pocet&#34;函数,我在其中传递一个数组,并希望打印其值。但它总是打印未定义的数字
功能看起来像这样
int pocet(int array[][2],int *counter) {
int poc = 0;
int i;
for ( i =0; i < *counter ;i++) {
printf("cislo = %d", array[i][0]);
}
return poc;
}
正如你所看到的,它有静态的第二维,我怎样才能使这个工作?
答案 0 :(得分:3)
您正在为5
指针分配空间,您应该乘以指针的大小而不是int
的大小,就像这样
vrat = malloc(max * sizeof(int *));
/* ^ pointer */
虽然你可以通过乘以像
这样的指针类型的大小来完全避免错误vrat = malloc(max * sizeof(*vrat));
并且在实际使用指针之前始终检查malloc()
是否未返回NULL
。
此外,请勿将scanf()
与EOF
进行比较,因为它在输入错误之前不太可能获得EOF
,因为它需要显式输入来自用户,而不是这样做
while(scanf("%d%c%d", &x, &c, &y) == 3)
函数的返回类型应与返回的对象的返回类型匹配,在本例中为int **
,将函数签名更改为
int **array(int *content)
答案 1 :(得分:1)
vrat = malloc(max*sizeof(int*));
您如何知道内存是否已成功分配?
始终检查malloc & family
函数返回的指针是否与NULL
等效,以避免可能SegFault
。
while (scanf("%d%c%d", &x, &c, &y) != EOF)
如果c
匹配失败怎么办?然后,scanf
将返回1
,while
仍然会进行迭代,即使scanf
无法在c
和y
中存储值。
所以请始终将scanf
返回值与否进行比较。参数而不是EOF
while (scanf("%d%c%d", &x, &c, &y) != EOF) {
vrat[index][0] = x;
vrat[index][1] = y;
index++;
}
如果index >= max
怎么办?
由于您只为max
整数指针分配了内存,因此不得尝试访问分配块之外的内存。
解决方案:将while
条件更改为
while ((scanf("%d%c%d", &x, &c, &y) == 3) && (index < max))
所以正确的代码片段是:
vrat = malloc(max*sizeof(int*));
if(!vrat)
{
printf("vrat: malloc failed!\n");
exit(1);
}
for ( i = 0; i < max ; i++) {
vrat[i] = malloc(2 * sizeof(int));
if(!vrat[i])
{
printf("vrat[%d]: malloc failed!\n", i);
exit(1);
}
}
int x;
int y;
char c;
while ((scanf("%d%c%d", &x, &c, &y) == 3) && (index < max)) {
vrat[index][0] = x;
vrat[index][1] = y;
index++;
}
答案 2 :(得分:1)
int**
不是int[][2]
。第一个是指向int
的指针,而第二个(作为参数)是指向int[2]
的指针。你不能像你尝试的那样在两者之间进行转换。你应该得到一个编译器警告/错误。
解决此问题的最简单方法是让pocet
将int**
作为第一个参数。解决其他人提到的问题。
答案 3 :(得分:0)
您已定义int **vrat;
当你做malloc时,你需要使用int **
或int *
而不是int