你如何迭代指针?

svs*_*sav 8 c pointers

例如:

int *start;
start = (int*)malloc(40);
Run Code Online (Sandbox Code Playgroud)

如果我想迭代所有40个字节,我该怎么做?我尝试过这样的事情:

while(start != NULL){
     start++;
}
Run Code Online (Sandbox Code Playgroud)

但是,它会迭代大量的值,远远大于40.因此,如何确保迭代所有40个字节.

谢谢你的帮助.

fkl*_*fkl 8

这里有两个问题.

单个ptr ++跳过与其指向的元素类型一样多的字节.

这里的类型是int,所以每次跳过4个字节(假设32位机器,因为整数是4个字节(32位)).

如果要迭代所有40个字节(一次一个字节),请使用char数据类型进行迭代(或者将int*类型转换为char*然后递增)

另一个问题是你的循环终止.

没有人在这里放置一个NULL,所以你的循环将继续运行(并且指针向前推进),直到它遇到可能是null或者超出你分配的内存区域并崩溃.行为未定义.

如果分配了40个字节,则必须自己终止40个字节.

更新:

基于对原始问题的评论和结果投票,值得一提的是,类型转换malloc的结果在C中不是一个好主意.主要原因是它可能潜在地篡改失败的分配.但它是C++的一项要求.详细信息可以在SO上的完全相同的问题中找到.搜索"malloc的返回值"


250*_*501 6

首先,你应该int正确分配s:

int* start = malloc( sizeof( int )*40 ) ;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用数组下标:

for( size_t i = 0 ; i < 40 ; i++ )
{
    start[i] = 0 ;
}
Run Code Online (Sandbox Code Playgroud)

或指向已分配内存末尾的指针:

int* end = start+40 ;
int* iter = start ;

while( iter < end )
{
    *iter= 0 ;
    iter++ ;
}
Run Code Online (Sandbox Code Playgroud)