[英]Address of malloc'ed array passed to function - seg fault
我有一個malloc
ed數組,我需要將其地址傳遞給另一個函數,以便它可以操作它。 但是,看起來我的C生銹了。
這是重現此問題的最少代碼:
#include <stdio.h>
#include <stdlib.h>
void f(int **ints)
{
printf("%d\n", *ints[1]);
}
int main()
{
int *ints = malloc(3);
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(&ints);
exit(EXIT_SUCCESS);
}
1)您只是將運算符的優先級錯誤(對於數組下標, []
的優先級比*
的指針取消優先級高)。 添加額外的一組括號,就可以了:
printf("%d\n", (*ints)[1]);
2)您要分配3個字節的內存,而不是3 * sizeof(int)
(帽子提示:alk):
int *ints = malloc(3 * sizeof(int));
要為分配內存int
分配sizeof(int)
,以具有空間3點int
就做:
int * ints = malloc(3 * sizeof(*ints)); /* 3 times the size of what ints points to. */
而且,如果您不需要操縱ints
本身的值,則可以直接傳遞數組:
#include <stdlib.h>
#include <stdio.h>
void f(int * ints)
{
printf("%d\n", ints[1]);
}
int main(void)
{
int * ints = malloc(3 * sizeof(*ints));
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(ints);
return 0;
}
好的,為了完整性:
如果確實需要傳遞ints
的地址(按照您的示例),請注意[]
運算符的綁定比*
運算符更緊密,請執行以下操作:
void f(int ** pints)
{
printf("%d\n", (*pints)[1]);
}
另外,最好傳遞數組中元素的數目,因為它不能從函數接收的指針中確定,如下所示:
#include <stdlib.h>
#include <stdio.h>
void f(int * ints, size_t n)
{
for (size_t i = 0; i < n; ++i)
{
printf("ints[%zu] = %d\n", i, ints[i]);
}
}
int main(void)
{
int * ints = malloc(3 * sizeof(*ints));
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(ints, 3);
return 0;
}
這應該工作:
printf("%d\n", (*ints)[1]);
除了godel9的答案,您不需要傳遞存儲數組地址的變量地址; 您只需要傳遞數組的地址即可。
#include <stdio.h>
#include <stdlib.h>
void f(int *ints)
{
printf("%d\n", ints[1]);
}
int main()
{
int *ints = malloc(3*sizeof(int));
ints[0] = 's';
ints[1] = 't';
ints[2] = 'a';
f(ints);
exit(EXIT_SUCCESS);
}
&ints
給出堆棧中代表int *ints
變量的4/8字節內存的地址。
編輯:我已經按照godel9 / alk的答案進行了修改以固定分配大小。我專注於參考計數:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.