C- 指针、数组和结构之间的交互
C- Interaction between pointers, arrays, and structs
我一直在阅读 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]);
}
应该会产生类似这样的输出:
0 1
1 2
2 3
3 4
4 5
5 some unknown value or a segfault, not sure which
各种指针和存储单元等应该是这样的:
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,我会得到 'unknown value' 结果(32765、32766 或 32767,无论出于何种原因),如果我将 e.data 换成新的 int* c,在 main 中定义并设置等于 b,我得到与 b 相同的结果,这对我来说意味着 e.data 实际上并没有被 buildExample 设置为 b。
为什么不呢?
当调用 buildExample()
时,您实际上传递了在 main()
中创建的 e
结构的副本,因此在函数 returns 时任何更改都将丢失。请改用指针。
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;
(应该是 unsigned
而不是 "unsigend")并试图访问名为 b
的元素(应该是 data
).
buildExample(&e, a, b);
while(i < e.length){
printf("%d %d\n", i, e.data[i]);
i++;
}
printf("%d %d\n", i, e.data[i]);
希望对您有所帮助!
此发布的代码存在一些问题。
1) 来自 main()
的 return 类型总是 int
而不是空白
2) 函数:buildExample()
修改 e
参数(在堆栈上)但对调用方返回的 e
变量没有任何影响 应该传递一个指针到结构并将分配更改为 e->length
和 e->data
3) 使用 unsigned
而不是取消签名`
4) 使用无意义的变量名和参数名使代码不必要地难以理解
5) 在对 printf()
的调用中 example
结构没有成员 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]);
}
我一直在阅读 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]);
}
应该会产生类似这样的输出:
0 1
1 2
2 3
3 4
4 5
5 some unknown value or a segfault, not sure which
各种指针和存储单元等应该是这样的:
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,我会得到 'unknown value' 结果(32765、32766 或 32767,无论出于何种原因),如果我将 e.data 换成新的 int* c,在 main 中定义并设置等于 b,我得到与 b 相同的结果,这对我来说意味着 e.data 实际上并没有被 buildExample 设置为 b。
为什么不呢?
当调用 buildExample()
时,您实际上传递了在 main()
中创建的 e
结构的副本,因此在函数 returns 时任何更改都将丢失。请改用指针。
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;
(应该是 unsigned
而不是 "unsigend")并试图访问名为 b
的元素(应该是 data
).
buildExample(&e, a, b);
while(i < e.length){
printf("%d %d\n", i, e.data[i]);
i++;
}
printf("%d %d\n", i, e.data[i]);
希望对您有所帮助!
此发布的代码存在一些问题。
1) 来自 main()
的 return 类型总是 int
而不是空白
2) 函数:buildExample()
修改 e
参数(在堆栈上)但对调用方返回的 e
变量没有任何影响 应该传递一个指针到结构并将分配更改为 e->length
和 e->data
3) 使用 unsigned
而不是取消签名`
4) 使用无意义的变量名和参数名使代码不必要地难以理解
5) 在对 printf()
的调用中 example
结构没有成员 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]);
}