- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 Tiva C launchpad (ARM Cortex M4) 上分配内存时遇到问题,我想做的是在某个时候动态分配指向另一个结构内部结构的指针 calloc()
返回一个指针,该指针的值与存储指针的地址相同。
我觉得这有点难以解释,所以我编写了这段代码来说明我想做什么,并且在 here 上运行得非常好。 ,但它在我的应用程序中的工作方式不同。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct
{
uint32_t Pin;
uint32_t Port;
} fGpio_Pin;
typedef struct
{
uint32_t Mode;
uint32_t nPins;
fGpio_Pin** Pins;
} fSpi_Mod;
fSpi_Mod* Spi;
void printSizes (void)
{
printf("Size of uint8_t: %i bytes.\n", sizeof(uint8_t));
printf("Size of uint16_t: %i bytes.\n", sizeof(uint16_t));
printf("Size of uint32_t: %i bytes.\n", sizeof(uint32_t));
printf("Size of uint64_t: %i bytes.\n", sizeof(uint64_t));
printf("Size of fSpi_Mod*: %i bytes.\n", sizeof(fSpi_Mod*));
printf("Size of fSpi_Mod: %i bytes.\n", sizeof(fSpi_Mod));
printf("Size of fGpio_Pin**: %i bytes.\n", sizeof(fGpio_Pin**));
printf("Size of fGpio_Pin*: %i bytes.\n", sizeof(fGpio_Pin*));
printf("Size of fGpio_Pin: %i bytes.\n", sizeof(fGpio_Pin));
printf("----\n");
}
void printStructure (fSpi_Mod* Spi_Mod)
{
uint8_t i;
printf("The address of the structure is 0x%X.\n", Spi_Mod);
printf("The value of mode is 0x%X and address 0x%X.\n", Spi_Mod->Mode, &(Spi_Mod->Mode));
printf("The value of nPins is 0x%X and address 0x%X.\n", Spi_Mod->nPins, &(Spi_Mod->nPins));
printf("The value of Pins is 0x%X and address 0x%X.\n", Spi_Mod->Pins, &(Spi_Mod->Pins));
for (i = 0; i < Spi_Mod->nPins; i++)
{
printf("#%i | The pointer that points to Gpio structure is 0x%X at address 0x%X.\n", i, *(Spi_Mod->Pins + i), &(*(Spi_Mod->Pins + i)));
printf("#%i | The value of Pin of Gpio structure is 0x%X and address 0x%X.\n", i, ((*(Spi_Mod->Pins + i)))->Pin, &(((*(Spi_Mod->Pins + i)))->Pin));
printf("#%i | The value of Port of Gpio structure is 0x%X and address 0x%X.\n", i, ((*(Spi_Mod->Pins + i)))->Port, &(((*(Spi_Mod->Pins + i)))->Port));
}
printf("----\n");
}
int main()
{
uint8_t i = 0;
printf(">>>> Begin program.\n");
printSizes();
Spi = (fSpi_Mod*) calloc(1, sizeof(fSpi_Mod));
if (Spi == NULL) {
printf("Insufficient memory.\n");
return 1;
}
//printStructure(Spi);
Spi->Mode = 0x05;
Spi->nPins = 0x04;
Spi->Pins = (fGpio_Pin**) calloc(Spi->nPins, sizeof(fGpio_Pin*));
if (Spi->Pins == NULL)
{
printf("Insufficient memory.\n");
return 1;
}
//printStructure(Spi);
for (i = 0; i < Spi->nPins; i++)
{
(*(Spi->Pins + i)) = (fGpio_Pin*) calloc(1, sizeof(fGpio_Pin));
if ((*(Spi->Pins + i)) == NULL)
{
printf("Insufficient memory.\n");
return 1;
}
}
printStructure(Spi);
printf(">>>> End program.\n");
}
在我的应用程序中,当我尝试分配四个类型为“指向(fGpio_Pin*)
”的指针并将其转换为(fGpio_Pin**)
时,calloc()
返回Spi->Pins
的地址,所以基本上Spi->Pins
的地址和它的值是一样的,就变成了指向自身的指针,这就是问题开始出现的时候。
堆中有足够的内存,calloc()
没有返回 NULL
指针,这可能是依赖于实现的吗?我使用的是 TI ARM 编译器和 Code Composer Studio,而不是 gcc。
也许我遗漏了什么,所以我会继续寻找。感谢您的宝贵时间。
编辑1:
这是上面代码的输出,可以正常工作。
>>>> Begin program.
Size of uint8_t: 1 bytes.
Size of uint16_t: 2 bytes.
Size of uint32_t: 4 bytes.
Size of uint64_t: 8 bytes.
Size of fSpi_Mod*: 8 bytes.
Size of fSpi_Mod: 24 bytes.
Size of fGpio_Pin**: 8 bytes.
Size of fGpio_Pin*: 8 bytes.
Size of fGpio_Pin: 8 bytes.
----
The address of the structure is 0x1DF7010.
The value of mode is 0x5 and address 0x1DF7010.
The value of nPins is 0x4 and address 0x1DF7014.
The value of Pins is 0x1DF7030 and address 0x1DF7018.
#0 | The pointer that points to Gpio structure is 0x1DF7060 at address 0x1DF7030.
#0 | The value of Pin of Gpio structure is 0x0 and address 0x1DF7060.
#0 | The value of Port of Gpio structure is 0x0 and address 0x1DF7064.
#1 | The pointer that points to Gpio structure is 0x1DF7080 at address 0x1DF7038.
#1 | The value of Pin of Gpio structure is 0x0 and address 0x1DF7080.
#1 | The value of Port of Gpio structure is 0x0 and address 0x1DF7084.
#2 | The pointer that points to Gpio structure is 0x1DF70A0 at address 0x1DF7040.
#2 | The value of Pin of Gpio structure is 0x0 and address 0x1DF70A0.
#2 | The value of Port of Gpio structure is 0x0 and address 0x1DF70A4.
#3 | The pointer that points to Gpio structure is 0x1DF70C0 at address 0x1DF7048.
#3 | The value of Pin of Gpio structure is 0x0 and address 0x1DF70C0.
#3 | The value of Port of Gpio structure is 0x0 and address 0x1DF70C4.
----
>>>> End program.
在我的应用程序中(我无法发布图像,我没有足够的声誉):
在调用之后:
最佳答案
我认为您的第一个 calloc 调用分配的内存不足。从您发布的调试器的屏幕截图:
SpiRfid = (fSpi_Mod*) calloc(1, sizeof(SpiRfid));
这只会为指针分配足够的内存,而不是结构。你可能想要
SpiRfid = (fSpi_Mod*) calloc(1, sizeof(*SpiRfid));
关于calloc 返回指向自身的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28647039/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
指针, C语言的精髓 莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA). 什么是指针 保存变量地址的变量叫做指针. 这是大概的定义, 但是Defad认为
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我是一名优秀的程序员,十分优秀!