如果我有一个指向某个堆分配空间的指针,该空间代表一个典型的行主要二维数组,是否可以将此指针强制转换为指向VLA的等效指针以方便子脚本编写? 例: // // Assuming ‘m’ was allocated and initialized something like: // // int *matrix = malloc(sizeof(*matrix) * rows * cols); // // for (int r = 0; r < rows; r++) { // for (int c = 0; c < cols; c++) { // matrix[r * cols + c] = some_value; // } […]
在某些体系结构上,可能需要为其他相同的对象使用不同的指针类型。 特别是对于哈佛架构CPU,您可能需要以下内容: uint8_t const ram* data1; uint8_t const rom* data2; 特别是这对于PICs的MPLAB C18(现已停产)中ROM / RAM指针的定义如何。 它甚至可以定义如下内容: char const rom* ram* ram strdptr; 这意味着RAM中的指针指向RAM中指向ROM中的字符串的指针(使用ram是没有必要的,因为默认情况下这个编译器在RAM中,为了清楚起见,只是添加了所有内容)。 这种语法的好处是编译器能够在您尝试以不兼容的方式分配时提醒您,例如ROM位置的地址到指向RAM的指针(类似于data1 = data2;或传递ROM)使用RAM指针指向函数的指针会产生错误)。 与此相反,在AVR-8的avr-gcc中,没有这种类型的安全性,因为它提供了访问ROM数据的function。 无法将指向RAM的指针与指向ROM的指针区分开来。 在某些情况下,这种类型的安全性对于捕获编程错误非常有益。 有没有办法以某种方式向指针添加类似的修饰符(例如通过预处理器,扩展到可以模仿这种行为的东西)来实现此目的? 甚至是一些警告不正当访问的东西? (在avr-gcc的情况下,尝试在不使用ROM访问function的情况下获取值)
这个问题可能听起来很愚蠢,但我并不确定。 我的意思是,有什么区别: char* line = (char*) malloc(MAX_LINE_LEN); 和 char line[MAX_LINE_LEN]; 究竟? 我知道前者是一个指针而后者是一个数组,但系统如何区分呢? 如何分配/存储内存? 另外,为什么可以在声明为指针时删除line占用的内存,而不是当它是数组时? 我认为数组存储在其他地方,系统会在超出范围时自动释放内存,这在处理指针时不会发生,所以你必须自己删除它。 我错了吗?
c-faq告诉我,编译器在处理a [i]时做了不同的事情,而a是数组或指针。 这是c-faq的一个例子: char a[] = “hello”; char *p = “world”; 鉴于上面的声明,当编译器看到表达式a [3]时,它会发出代码从位置“a”开始,移动三个,然后在那里获取字符。 当它看到表达式p [3]时,它会发出代码从位置“p”开始,在那里获取指针值,向指针添加三个,最后获取指向的字符。 但有人告诉我,在处理[i]时,编译器倾向于将a(这是一个数组)转换为指向数组的指针。 所以我想查看汇编代码以找出哪个是正确的。 编辑: 这是本声明的来源。 c-faq并注意这句话: formsa [i]的表达式导致数组衰减成指针,遵循上面的规则,然后被下标,就像表达式p [i]中的指针变量一样(尽管最终的内存访问将是不同,“ 我对此很困惑:既然a已经衰减到指针,那为什么他的意思是“内存访问会有所不同?” 这是我的代码: // array.cpp #include using namespace std; int main() { char a[6] = “hello”; char *p = “world”; printf(“%c\n”, a[3]); printf(“%c\n”, p[3]); } 这是我使用g ++ -S array.cpp获得的汇编代码的一部分 .file “array.cpp” .section .rodata […]
我正在从遗留代码中删除gcc警告。 是否可以通过类型转换抑制警告“从不同大小的整数转换为指针”: example: some_struct *ptr = func() // func() returns an integer. 有人可以指导我如何解决这样的gcc警告吗?
例如: void func1(){ int i = 123; func2(&i); } void func2(int *a){ *a = 456; } 当func1调用func2 ,一个指向局部变量的指针被传递给func2 – 指针指向堆栈。 这对C的规则是否安全? 谢谢。
据我所知,在以下行中,我们尝试写入无效的内存位置。 但这实际上也是一个未对齐的指针。 有人可以解释什么是未对齐的指针,以及下面的未对齐指针是什么? *(int*)0xffffffff = 0xbad;
我是C的新手,我在学习指针方面遇到了一些问题。 我尝试了交换,这就是我可以用它们做的全部:)我知道每个变量在内存单元中都有自己的地址(这是我的讲师告诉我们的),每个变量的值都可以通过转到它的相关地址来获得获取存储在其中的值。 我见过一些函数头文件,例如: int doSomething(char **hihi); 我的头很困惑。 我知道指针也是一个变量,它只在地址信息中存储地址信息。 我读到它们与数组密切相关 arr = &arr[0]; 这就是我对指针的了解,我想知道如何加深我对指针的看法。 我搜索网,我找不到任何有用的备忘单覆盖指针。 而且我也想知道为什么它们如此重要并且有没有办法在不使用printf()打印它们的地址( p )和值( \*p )的情况下理解实际发生了什么?
使用带指针的const可以通过使用有问题的指针解除引用,使得指针对象无法修改。 但为什么我也不能修改指针没有直接指向的东西? 例如: int a = 3; const int* ptr = &a; *ptr = 5; 不会编译。 但为什么呢 *(ptr + 2) = 5; 还没编译? 我没有改变指针指向的内容。 所以我们不得不说使用带有指针的const这样不仅使得指针指向的东西不可修改(通过解引用指针)而且还有其他任何东西,我们使用指针得到的地址是什么? 我知道在示例中我试图访问未分配的内存,但这只是为了讨论。
我写了一个C程序如下: 情况1 int *a; /* pointer variable declaration */ int b; /* actual variable declaration */ *a=11; a=&b;/* store address of b in pointer variable*/ 它在运行程序时出现分段错误。 我更改了代码如下: 案例2 int *a; /* pointer variable declaration */ int b; /* actual variable declaration */ a=&b;/* store address of b in pointer variable*/ *a=11; 现在它工作正常。 如果有人知道请解释为什么它在CASE 1中给出了分段错误。