Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中为结构分配数组_C - Fatal编程技术网

如何在C中为结构分配数组

如何在C中为结构分配数组,c,C,假设我有一个简单的结构,比如: struct myStruct { uint8_t arr[10]; }; 我想要做的就是修改该数组的内容。但是,我似乎无法直接分配数组(即,我无法执行类似pointerToThisStruct->arr=anArrayofSizeTen的操作) 这是我的主要方法: int main(int argc, char **argv) { uint8_t test[10] = {0}; myStruct *struc; struc-&g

假设我有一个简单的结构,比如:

struct myStruct {

   uint8_t arr[10];
};
我想要做的就是修改该数组的内容。但是,我似乎无法直接分配数组(即,我无法执行类似pointerToThisStruct->arr=anArrayofSizeTen的操作)

这是我的主要方法:

int main(int argc, char **argv) {
    uint8_t test[10] = {0};
    myStruct *struc;
    struc->arr = test; //can't do this
    memcpy(struc->arr, test, sizeof(test));
}

现在,我明白了直接复制是行不通的,但为什么memcpy也会给我一个错误呢?我应该如何准确地修改结构数组?

您需要声明一个实际的
myStruct
。不是指向一个的指针。声明指向的指针实际上并不会为结构分配任何内存

#include <stdio.h>
#include <stdint.h>
#include <string.h>

struct myStruct {

   uint8_t arr[10];
};


int main(int argc, char **argv) {

    int i;
    uint8_t test[10] = {0,1,2,3,4,5,6,7,8,9};
    struct myStruct struc;
    memcpy(struc.arr, test, sizeof(struc.arr));


    printf("struc.arr[] = ");

    for( i=0; i < sizeof(test); i++ )
    {
        printf("%d ", struc.arr[i]);
    }

    printf("\n");
    return( 0 );
}
#包括
#包括
#包括
结构myStruct{
uint8_t arr[10];
};
int main(int argc,字符**argv){
int i;
uint8_t检验[10]={0,1,2,3,4,5,6,7,8,9};
结构myStruct struct;
memcpy(结构arr、测试、尺寸(结构arr));
printf(“结构arr[]=”;
对于(i=0;i
您需要声明一个实际的
myStruct
。不是指向一个的指针。声明指向的指针实际上并不会为结构分配任何内存

#include <stdio.h>
#include <stdint.h>
#include <string.h>

struct myStruct {

   uint8_t arr[10];
};


int main(int argc, char **argv) {

    int i;
    uint8_t test[10] = {0,1,2,3,4,5,6,7,8,9};
    struct myStruct struc;
    memcpy(struc.arr, test, sizeof(struc.arr));


    printf("struc.arr[] = ");

    for( i=0; i < sizeof(test); i++ )
    {
        printf("%d ", struc.arr[i]);
    }

    printf("\n");
    return( 0 );
}
#包括
#包括
#包括
结构myStruct{
uint8_t arr[10];
};
int main(int argc,字符**argv){
int i;
uint8_t检验[10]={0,1,2,3,4,5,6,7,8,9};
结构myStruct struct;
memcpy(结构arr、测试、尺寸(结构arr));
printf(“结构arr[]=”;
对于(i=0;i
由于未分配结构指针,您将遇到分段错误

int main(int argc, char **argv) {
    uint8_t test[10] = {0};
    struct myStruct *struct = malloc(sizeof(struct myStruct));
    if (!struc)
        return -1;
    memcpy(struc->arr, test, sizeof(test));
    free(struc);
    return 0;
}

但是,正如@Chimera所提到的,您完全不能直接使用点和堆分配的结构,并使用
操作符访问其内部字段,因为您没有分配结构指针,所以您会遇到分段错误

int main(int argc, char **argv) {
    uint8_t test[10] = {0};
    struct myStruct *struct = malloc(sizeof(struct myStruct));
    if (!struc)
        return -1;
    memcpy(struc->arr, test, sizeof(test));
    free(struc);
    return 0;
}

但是,正如@Chimera所提到的,您完全不能使用点和直接的堆分配结构,并使用
操作符访问其内部字段,因为您创建了指向结构的指针,所以您正在进行分段故障处理。而不是我的结构*struc;使用myStruct struc并使用struc.arr引用成员“arr”。@Chimera这有区别吗?我的印象是箭头->与延迟指针,然后使用“.”相同,你有一个指针。。。但它指的是什么?您没有实际的结构。@arrel1990您使用的取消引用运算符(箭头)是正确的,但您从未为结构分配内存。您只要求为指针提供内存,这意味着指针指向未初始化的内存。试图复制到操作系统未分配给您的内存会导致segfault。耳环1990:是的,这确实会产生影响。指针具有内存地址的值。它实际上并不包含“对象”。你可以像@Chimera所说的那样创建结构,或者为你的结构分配内存。因为你创建了一个指向结构的指针,所以你是在分段出错。而不是我的结构*struc;使用myStruct struc并使用struc.arr引用成员“arr”。@Chimera这有区别吗?我的印象是箭头->与延迟指针,然后使用“.”相同,你有一个指针。。。但它指的是什么?您没有实际的结构。@arrel1990您使用的取消引用运算符(箭头)是正确的,但您从未为结构分配内存。您只要求为指针提供内存,这意味着指针指向未初始化的内存。试图复制到操作系统未分配给您的内存会导致segfault。耳环1990:是的,这确实会产生影响。指针具有内存地址的值。它实际上并不包含“对象”。你可以像@Chimera所说的那样创建结构,或者为你的结构分配内存。别忘了
free(struc)
My bad。我会根据你明智的建议更新代码。另外,不要使用
struct
作为变量名-它是一个C关键字。请注意,OP使用了
struc
。别忘了
free(struc)
My bad。我会根据你明智的建议更新代码。另外,不要使用
struct
作为变量名-它是一个C关键字。请注意,OP使用的是
struc
。次要:当源和目标可能与
memcpy()的大小不同时,建议使用目标的大小作为大小:
memcpy(struc.arr,test,sizeof struc.arr)
(或使用编译时测试确保两个大小匹配)次要:当源和目标可能与
memcpy()
的大小不同时,建议使用目标的大小作为大小:
memcpy(struc.arr,test,sizeof struc.arr)(或使用编译时测试确保两个大小匹配)