Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Arrays_Pointers_Struct_Pointer Arithmetic - Fatal编程技术网

C-指针、数组和结构之间的交互

C-指针、数组和结构之间的交互,c,arrays,pointers,struct,pointer-arithmetic,C,Arrays,Pointers,Struct,Pointer Arithmetic,我一直在阅读C中的指针和数组,试图学习如何作为结构的一个成员来实现VLA ish。(具体来说,我需要一个数组或类似数组的对象,其长度在结构实例之间不同,但在编译时为任何特定结构实例定义。) 在我看来好像是这样的: typedef struct example{ unsigned char length; char *data; }example; int buildExample(example e, unsigned char l, char * const d){

我一直在阅读C中的指针和数组,试图学习如何作为结构的一个成员来实现VLA ish。(具体来说,我需要一个数组或类似数组的对象,其长度在结构实例之间不同,但在编译时为任何特定结构实例定义。)

在我看来好像是这样的:

typedef struct example{
    unsigned char length;
    char *data;
}example;

int buildExample(example e, unsigned char l, char * const d){
    e.length = l;
    e.data = d;
    return 0;
    //not safe I know, but that fact isn't relevant to the question.
}


main(){
    example e;
    unsigend char a = 5;
    char b[] = {1, 2, 3, 4, 5};
    buildExample(e, a, b);
    int i = 0;
    while(i < e.length){
        printf("%d  %d\n", i, e.b[i]);
        i++;
    }
    printf("%d  %d\n", i, e.b[i]);
}
before call to buildExample:

example e.data                 b               address 0, 1, 2...
|null pointer|         |ptr to address 0|      |  1  |  2  |  3  |  4  |  5  |

after call to buildExample:

example e.data                  address 0, 1, 2...
|ptr to address 0|              |  1  |  2  |  3  |  4  |  5  |
各种各样的指针和存储单元应该是这样的:

typedef struct example{
    unsigned char length;
    char *data;
}example;

int buildExample(example e, unsigned char l, char * const d){
    e.length = l;
    e.data = d;
    return 0;
    //not safe I know, but that fact isn't relevant to the question.
}


main(){
    example e;
    unsigend char a = 5;
    char b[] = {1, 2, 3, 4, 5};
    buildExample(e, a, b);
    int i = 0;
    while(i < e.length){
        printf("%d  %d\n", i, e.b[i]);
        i++;
    }
    printf("%d  %d\n", i, e.b[i]);
}
before call to buildExample:

example e.data                 b               address 0, 1, 2...
|null pointer|         |ptr to address 0|      |  1  |  2  |  3  |  4  |  5  |

after call to buildExample:

example e.data                  address 0, 1, 2...
|ptr to address 0|              |  1  |  2  |  3  |  4  |  5  |
但我只是得到了一个错误。 如果我将e.data换成b,我会得到“未知值”结果(32765、32766或32767,无论出于何种原因),如果我将e.data换成一个新的int*c,在main中定义并设置为等于b,我会得到与b相同的结果,这对我来说意味着e.data实际上没有通过buildExample设置为b


为什么不呢

调用
buildExample()
时,实际上传递的是在
main()
中创建的
e
结构的副本,因此当函数返回时,任何更改都将丢失。改用指针

int buildExample(example *e, unsigned char l, char * const d){
    e->length = l;
    e->data = d;
    return 0;
    //not safe I know, but that fact isn't relevant to the question.
}
打电话时:

buildExample(&e, a, b);
但是,您还有其他错误,例如
unsigend char a=5(应该是
无符号的
而不是“unsigend”),并尝试访问名为
b
(应该是
数据
)的元素

buildExample(&e,a,b);
while(即

希望有帮助

调用
buildExample()
时,实际上传递的是在
main()
中创建的
e
结构的副本,因此当函数返回时,任何更改都将丢失。改用指针

int buildExample(example *e, unsigned char l, char * const d){
    e->length = l;
    e->data = d;
    return 0;
    //not safe I know, but that fact isn't relevant to the question.
}
打电话时:

buildExample(&e, a, b);
但是,您还有其他错误,例如
unsigend char a=5(应该是
无符号的
而不是“unsigend”),并尝试访问名为
b
(应该是
数据
)的元素

buildExample(&e,a,b);
while(即

希望有帮助

此发布的代码存在一些问题

1)
main()
的返回类型始终为
int
而非空

2) 函数:
buildExample()

3) 使用未签名的
非反签名`

4) 使用无意义的变量和参数名称会使代码不必要地难以理解

5) 在对
printf()
的调用中,
example
struct没有成员
b

强烈建议在发布问题之前实际编译发布的代码

typedef struct example
{
    unsigned char dataCount;
    char *pData;
} example;

void buildExample(example *pExample, unsigned char dataCount, char * const pData)
{
    pExample->dataCount = dataCount;
    pExample->pData = pData;
}


int main( void )
{
    example myExample;
    unsigned char dataCount = 5;
    char data[] = {1, 2, 3, 4, 5};

    buildExample(&myExample, dataCount, data);

    for( int i=0; i<myExample.count; i++)
    {
        printf("%d  %d\n", i, myExample.pData[i]);
    }
    printf("%d  %d\n", i, myExample.pData[i]);
}
typedef结构示例
{
无符号字符数据计数;
char*pData;
}榜样;
void buildExample(example*pExample,unsigned char dataCount,char*const pData)
{
例如->数据计数=数据计数;
例如->pData=pData;
}
内部主(空)
{
例如我的例子;
无符号字符数据计数=5;
字符数据[]={1,2,3,4,5};
buildExample(&myExample,dataCount,data);

对于(inti=0;i,此发布代码存在一些问题

1)
main()
的返回类型始终为
int
而非空

2) 函数:
buildExample()

3) 使用未签名的
非反签名`

4) 使用无意义的变量和参数名称会使代码不必要地难以理解

5) 在对
printf()
的调用中,
example
struct没有成员
b

强烈建议在发布问题之前实际编译发布的代码

typedef struct example
{
    unsigned char dataCount;
    char *pData;
} example;

void buildExample(example *pExample, unsigned char dataCount, char * const pData)
{
    pExample->dataCount = dataCount;
    pExample->pData = pData;
}


int main( void )
{
    example myExample;
    unsigned char dataCount = 5;
    char data[] = {1, 2, 3, 4, 5};

    buildExample(&myExample, dataCount, data);

    for( int i=0; i<myExample.count; i++)
    {
        printf("%d  %d\n", i, myExample.pData[i]);
    }
    printf("%d  %d\n", i, myExample.pData[i]);
}
typedef结构示例
{
无符号字符数据计数;
char*pData;
}榜样;
void buildExample(example*pExample,unsigned char dataCount,char*const pData)
{
例如->数据计数=数据计数;
例如->pData=pData;
}
内部主(空)
{
例如我的例子;
无符号字符数据计数=5;
字符数据[]={1,2,3,4,5};
buildExample(&myExample,dataCount,data);

对于(inti=0;iIn除了cdont的答案之外,这仍然是运行时的,而不是您所说的要实现的编译时。感谢您提供的信息!我对编译时的评论是指出该数字在编译时可用,而不是我希望在编译时设置的,因此编译时解决方案对我来说是可行的。在add中根据cdont的回答,这仍然是运行时的,而不是您所说的要实现的编译时。谢谢您提供的信息!我对编译时的评论是指出该数字在编译时可用,而不是我希望它在编译时设置,因此编译时解决方案对我来说是可行的。谢谢!这是一个错误这是一条非常重要的信息!这些错误实际上不在我的代码中,我在复制和简化代码时无意中输入了它们,这就是我的错误。谢谢!这是一条非常重要的信息!这些错误实际上不在我的代码中,我在复制和简化代码时无意中输入了它们,所以这是我的错误。