- 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/
这个问题已经有答案了: Do I cast the result of malloc? (29 个回答) 已关闭 8 年前。 有什么区别: int *array; array = (int*) cal
我是一名初学者 C 程序员,我认为情况会是这样,但如果可能的话,我希望得到一些肯定。 如果它们相同,为什么不只取一个参数呢? 最佳答案 calloc(a, b) 和 calloc(b, a) 之间没有
这个问题在这里已经有了答案: Is calloc(4, 6) the same as calloc(6, 4)? (7 个答案) 关闭 3 个月前。 calloc(10,4) 和 calloc(1,
所以calloc()通过向操作系统询问一些虚拟内存来工作。操作系统与 MMU 协同工作,并巧妙地以虚拟内存地址进行响应,该地址实际上映射到 copy-on-write, read-only page
在玩 hashmap 玩具示例的实现时(为了好玩)我发现了一个奇怪的行为,calloc 没有像预期的那样将我想要的整个内存块初始化为零。如果整个内存块都清零,则以下代码应该不会产生任何输出: #inc
我想创建一个封装动态分配数组的结构。它看起来像这样: typedef struct IntArray { int *field; size_t length; } IntArray;
我正在开发一个 C 项目,事实证明,在特定时刻,我调用了 calloc() 函数,它分配了一个已在使用中的内存块。这怎么可能?我检查了我的内存分配使用情况,每次调用 malloc/calloc 时,我
在我的程序中,calloc() 不适用于超过 38 的大小,但小于此数字则可以完美运行。在本例中,我想分配 128 个 int,然后释放它。 怎么了? #include #include #inc
我的main函数有这个: int main() { // double minW, minL, width, length; unsigned tileCap = 10; auto
首先,这是我见过的最奇怪的错误。我不知道发生了什么事。任何人都可以就正在发生的事情提供任何帮助,我们将不胜感激。 我正在编写一个 C 程序,该程序将文件读入动态分配的 block 并在这些 blo
calloc 是否分配返回连续的内存位置?如果是,如果不可用,它会做什么? 最佳答案 Does calloc allocate returns contiguous memory location?
这句话是什么意思? //allocated memory for Device info (*PppsCoreStructure)->psDeviceDetails=(sDeviceDetails *
这是我的代码: #include #include int main(){ int n=10; char *s= calloc(2,sizeof(char)); sprintf(s,"%d",n)
我在 Tiva C launchpad (ARM Cortex M4) 上分配内存时遇到问题,我想做的是在某个时候动态分配指向另一个结构内部结构的指针 calloc() 返回一个指针,该指针的值与存储
我是 C 的新手。 我知道这是正确的: char* Str; Str = (char*)calloc(Str_Len, sizeof(char)); ,但为什么这是不正确的? char* Str; *
我遇到了某种指针冲突, 基本上,在我做的一个函数中, a = calloc(1,28); // gives me 0x100100d10 然后很快在我做的一个子函数中, b = calloc(1,16
这是一段代码。N=70000 或更多时,代码会继续执行 STEP1 并因段错误而崩溃。相反,如果我把例如N=50000,calloc返回NULL,程序退出返回2。那么为什么 N=70000 callo
查看刚刚提出的这个问题:Inconveniences of pointers to static variables那么,这样做会被视为不良做法吗? char* strpart(char* strin
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is NULL always zero in C? C 标准为 calloc() 规定了以下内容: The
清零内存有什么优势(即 calloc() 优于 malloc())?无论如何,您不会将值更改为其他值吗? 最佳答案 有两个阵营:一个说在声明变量时初始化变量有助于发现错误。这个阵营中的人确保他们声明的
我是一名优秀的程序员,十分优秀!