我写了一个程序,其中涉及两行整数定期交换位置。因此,我分配了两个单独的指向整数的指针来模拟所需的行。然后,我将这两个指针放入一个常量指针数组中,以便轻松地进行交换。
我遇到的问题是完全错误的。以这个为例:
使用输出:
在IdeOne运行时无法编译。但是,在Microsoft Visual Studio Professional 2013和
对于我试图做的事情,有什么想法或建议吗?也就是说,如何访问包含在静态数组
我遇到的问题是完全错误的。以这个为例:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char* a = malloc(sizeof(char)*5);
char* temp[] = {a};
int i, h, k = 'a';
for(i = 0; i < 5; i++)
a[i] = k++;
for(i = 0; i < 5; i++)
printf("%c ", temp[0][i]);
free(a);
return 0;
}
使用输出:
a b c d e
IdeOne
我无意中尝试通过二次间接引用“[][]”访问静态数组中包含的数组的成员:
我没有太在意这件事情,因为一切都编译和运行得很完美,甚至在输出时给出了预期的结果。问题是当我运行内存分析时,发现我得到了大量的寻址错误和假定的内存泄漏。
所以,为了开始调试过程,我想来这里问一下这为什么有效并且它是否是有效的C语法。我的印象是:
temp[0]
会解引用为char*
类型的指针a
。需要再次对a
进行解引用才能访问其成员。此外,我认为:
temp[row][col]
Is translated to:
*(*(temp + row*col) + col)
在运行时。因此,temp[0][i]
的双重引用应该给出从temp
的偏移量,而不是访问a
。
更有趣的是:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char* a = malloc(sizeof(char)*5);
char* b = malloc(sizeof(char)*5);
char* temp[] = {a, b};
int i, h, k = 'a', j = 'A';
for(i = 0; i < 5; i++){
a[i] = k++;
b[i] = j++;
}
for(i = 0; i < 5; i++){
for(h = 0; h < 5; h++)
printf("%c ", temp[i][h]);
puts("");
}
free(a);
free(b);
return 0;
}
在IdeOne运行时无法编译。但是,在Microsoft Visual Studio Professional 2013和
c99
模式下使用gcc
,这段代码确实可以编译。对于我试图做的事情,有什么想法或建议吗?也就是说,如何访问包含在静态数组
temp
中的成员a
和b
,而不使用非常丑陋的语法?*(temp[i] + sizeof(char)*h)
temp
的五个索引,但只有两个可用。 - hamstergeneint* foo[5]
数组实际上与指向一个内存块sizeof(int)*5
的常量整数数组相同。因此,foo[2]
指向第三个整数,但也可以使用*(foo+2)
解引用到相同的成员。也许你在标题中没有使用正确的术语,但每个人似乎都理解了这个想法。 - sherrellbcfoo
是一个常量指针,因此*(foo+2)将用户引导到第三个整数。 - sherrellbc