在void中指向一个字符串数组

时间:2015-05-04 16:35:12

标签: c++ c struct void-pointers double-pointer

我在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);
    }
}

1 个答案:

答案 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_strstarr *,其索引(例如array_str[i])是starr所以请使用.表示法而不是->符号。

3:calloc将在声明内存时清除字节,以便将它们初始化为NULL字节,如果不提供,则可以避免打印可能导致缓冲区溢出的字符串无论出于何种原因,他们都是正确的价值观。

4:n应该是size_t类型,以与其含义一致,即数组中索引的数量。

5:不要忘记free(array_str);,因为您使用malloc / calloc对其进行了初始化。