Java C语言中的指针运算混乱
我检查了下面的C代码,据我所知,当你增加一个指针(按+=2等)时,指针的地址将增加2(在本例中)*指针类型的大小。下面的代码来自一个控制台应用程序,它可以工作,但是这些知识似乎不适用于这里Java C语言中的指针运算混乱,java,c,pointers,void-pointers,Java,C,Pointers,Void Pointers,我检查了下面的C代码,据我所知,当你增加一个指针(按+=2等)时,指针的地址将增加2(在本例中)*指针类型的大小。下面的代码来自一个控制台应用程序,它可以工作,但是这些知识似乎不适用于这里 void some_function(data_type_for_something *c, unsigned long *data, int blocks) { unsigned long *d; int i; d = data; for (i = 0; i < bl
void some_function(data_type_for_something *c, unsigned long *data, int blocks)
{
unsigned long *d;
int i;
d = data;
for (i = 0; i < blocks; i++)
{
change_values_at_d_and_d_plus_one_to_new_ones(c, d, d+1);
d += 2;
}
}
其中,数据是无符号字符的缓冲区。
如果您使用some_函数,您可以看到它将访问缓冲区之外的内存。这可能是什么原因
我试图用java编写以下代码:
public static long[] some_function(the_data_type bc, long[] data, int blocks) {
long[] ret = new long[data.length];
int index = 0;
for(int i = 0;i<blocks; i++) {
Pair<Long,Long> r = function_with_long_name(bc, data[index], data[index+1]);
ret[index]=r.getFirst();
ret[index+1]=r.getSecond();
index+=2;
}
return ret;
}
public static long[]some_函数(_data_类型bc,long[]data,int块){
long[]ret=新的long[data.length];
int指数=0;
对于(int i=0;i上述两条注释是正确的,您应该确保理解它们。我认为纠正此代码的最简单方法就是删除无关变量并直接使用循环不变量
确保检查所有适用的边界(注意我添加的&
)
public static long[]some_函数(_data_类型bc,long[]data,int块){
long[]ret=新的long[data.length];
for(int index=0;index)在C中访问超出边界的数组元素是未定义的行为,不一定会立即导致错误。可能重复:(尤其是接受的答案):data[index]将在块/2次迭代后抛出,因为每次迭代都会将索引增加2。对于循环,请尝试将循环条件设置为for(…;ipublic static long[] some_function(the_data_type bc, long[] data, int blocks) {
long[] ret = new long[data.length];
int index = 0;
for(int i = 0;i<blocks; i++) {
Pair<Long,Long> r = function_with_long_name(bc, data[index], data[index+1]);
ret[index]=r.getFirst();
ret[index+1]=r.getSecond();
index+=2;
}
return ret;
}
public static long[] some_function(the_data_type bc, long[] data, int blocks) {
long[] ret = new long[data.length];
for (int index = 0; index<blocks && index < ret.length-1; index += 2) {
Pair<Long,Long> r = function_with_long_name(bc, data[index], data[index+1]);
ret[index] = r.getFirst();
ret[index+1] = r.getSecond();
}
return ret;
}