我在void中传递指针时遇到一些问题。此void仅显示struct数组的第一个位置。当循环进入第二个位置时,我得到“分段错误”。我试图用相同的循环显示主内部的数组并且它有效。问题是什么?
typedef struct starr{
char string[100];
int occ;
} starr;
int main(){
int n;
starr *array_str;
//insert n and array_str
array_str=(starr *)malloc(sizeof(starr)*n);
view(&array_str,n);
}
void view(starr *array_str, n){
int i;
for(i=0;i<n;i++){
printf("String %s",array_str[i]->string);
}
}
答案 0 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
typedef struct starr {
char string[100];
int occ;
} starr;
void view(starr *array_str, size_t n);
int main() {
size_t n;
// initialize n
starr *array_str;
array_str = (starr *)calloc(n, sizeof(starr));
// do stuff with array_str
view(array_str, n);
free(array_str); // go! be free!
}
void view(starr *array_str, size_t n) {
size_t i;
for(i = 0; i < n; i++){
printf("String %s", array_str[i].string);
}
}
1:view
接受starr *
,array_str
已经是该类型,因此无需使用&
引用它。
2:由于array_str
是starr *
,其索引(例如array_str[i]
)是starr
所以请使用.
表示法而不是->
符号。
3:calloc
将在声明内存时清除字节,以便将它们初始化为NULL
字节,如果不提供,则可以避免打印可能导致缓冲区溢出的字符串无论出于何种原因,他们都是正确的价值观。
4:n
应该是size_t
类型,以与其含义一致,即数组中索引的数量。
5:不要忘记free(array_str);
,因为您使用malloc
/ calloc
对其进行了初始化。