如何在通过指向数组的指针访问时知道数组元素的数量
How to know the number of elements of an array while accessing through a pointer to that array
这是我的代码:
#include <stdio.h>
typedef struct{
int n;
char l;
} dat;
void printa(dat* x){
while(*x != NULL){
printf("%c %d\n",x->l,x->n);
x++;
}
}
int main(int argc,char* argv[]){
dat new[10]={
{4,'d'},
{7,'g'},
{3,'c'},
{6,'f'},
{2,'b'},
{5,'e'},
{1,'a'}
};
dat* x=new;
printa(x);
return 0;
}
我正在尝试通过预先填充的结构显示值,以便稍后我可以对它们进行排序。
包含while(*x != NULL)
的行对编译器来说是有问题的。它表示 error: invalid operands to binary !=
。然后我将其更改为 while(*x)
,认为我搞砸了指针声明,编译器抱怨 error: used struct type value where scalar is required
。然后我继续将行更改为 while(x)
。编译器还没有抱怨,执行代码产生了随机值和分段错误。
然后我通过 gdb 继续 运行 错误的编译代码,它指出
Program received signal SIGSEGV, Segmentation fault.
0x0804838f in printa ()
我可以通过修改我的代码以匹配如下内容轻松解决我的问题:
void printa(dat* x){
int num=0;
while(num++ < 2){
printf("%c %d\n",x->l,x->n);
x++;
}
}
但我宁愿让结构数组完全通过(打印所有元素)而不是在固定数量处停止。
不,你想要的无法直接实现。一旦使用 pointer 指向 array,指针不会继承任何关于数组大小的信息。因此,您不能将指针传递给函数并期望通过该指针计算数组的 valid 长度。
您必须遵循以下任一方法
- 将数组的长度作为第二个参数传递给函数。
- 在数组中使用sentinel value并检查函数中的值以停止访问。
如果指针以有效地址开头然后递增,则它永远不会为 NULL。
您需要修改数据以便循环知道何时停止。
使用while (x->n != 0)
.
在数据初始值设定项的末尾添加 {0, 0}
。
如果零是您数据中的有效值,那么您当然需要对其进行调整。
这是我的代码:
#include <stdio.h>
typedef struct{
int n;
char l;
} dat;
void printa(dat* x){
while(*x != NULL){
printf("%c %d\n",x->l,x->n);
x++;
}
}
int main(int argc,char* argv[]){
dat new[10]={
{4,'d'},
{7,'g'},
{3,'c'},
{6,'f'},
{2,'b'},
{5,'e'},
{1,'a'}
};
dat* x=new;
printa(x);
return 0;
}
我正在尝试通过预先填充的结构显示值,以便稍后我可以对它们进行排序。
包含while(*x != NULL)
的行对编译器来说是有问题的。它表示 error: invalid operands to binary !=
。然后我将其更改为 while(*x)
,认为我搞砸了指针声明,编译器抱怨 error: used struct type value where scalar is required
。然后我继续将行更改为 while(x)
。编译器还没有抱怨,执行代码产生了随机值和分段错误。
然后我通过 gdb 继续 运行 错误的编译代码,它指出
Program received signal SIGSEGV, Segmentation fault. 0x0804838f in printa ()
我可以通过修改我的代码以匹配如下内容轻松解决我的问题:
void printa(dat* x){
int num=0;
while(num++ < 2){
printf("%c %d\n",x->l,x->n);
x++;
}
}
但我宁愿让结构数组完全通过(打印所有元素)而不是在固定数量处停止。
不,你想要的无法直接实现。一旦使用 pointer 指向 array,指针不会继承任何关于数组大小的信息。因此,您不能将指针传递给函数并期望通过该指针计算数组的 valid 长度。
您必须遵循以下任一方法
- 将数组的长度作为第二个参数传递给函数。
- 在数组中使用sentinel value并检查函数中的值以停止访问。
如果指针以有效地址开头然后递增,则它永远不会为 NULL。
您需要修改数据以便循环知道何时停止。
使用
while (x->n != 0)
.在数据初始值设定项的末尾添加
{0, 0}
。
如果零是您数据中的有效值,那么您当然需要对其进行调整。