如何在主函数中分配指针?
我刚开始学习编程语言 C,在解决下面的 1 个练习时遇到了问题。
编写一个程序,为一个指针动态分配 10 个字节的内存,提供的函数模板如下: bool allocate10Bytes(uint8_t *outPtr);
- outPtr:输出指针
- return: true: 如果分配成功。false:如果分配失败。
我尝试了以下代码,但主函数中的指针仍未分配。
bool allocate10Bytes(uint8_t* outPtr)
{
outPtr = (uint8_t*)malloc(10 * sizeof(uint8_t));
if (outPtr == NULL) {
return false;
}
return true;
}
int main(void)
{
uint8_t* p = NULL;
bool success = allocate10Bytes(p);
if (success) free(p);
return 0;
}
请帮我。非常感谢!
回答
您的代码旨在更改指针参数的值,因为参数是按值传递的,代码更改了本地值outPtr的值,而不是main
要将指针作为参数传递并在 callee 中更改指针的值,我们在 C 中只有一种选择:将指针传递给指针
bool allocate10Bytes(uint8_t** outPtr) {
*outPtr = malloc(10 * sizeof(uint8_t));
if (*outPtr == NULL) {
return false;
}
return true;
}
int main(void) {
uint8_t* p = NULL;
bool success = allocate10Bytes(&p);
if (success) free(p);
return 0;
}
对于代码异味:在代码中使用幻数是不好的,10最好在这里添加一个宏或常量。
如果函数原型必须是bool allocate10Bytes(uint8_t* outPtr),那么我们需要在这里进行一些丑陋的转换。我不认为这是一个很好的练习题,也许你的老师做错了什么。
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
bool allocate10Bytes(uint8_t* outPtr) {
uint8_t** outPtr1 = (uint8_t**)(outPtr);
*outPtr1 = malloc(10 * sizeof(uint8_t));
if (*outPtr1 == NULL) {
return false;
}
return true;
}
int main(void) {
uint8_t* p = NULL;
bool success = allocate10Bytes((uint8_t*)&p);
if (success) free(p);
return 0;
}
- 无需投射指针
- `*outPtr = malloc(10 * sizeof(uint8_t));` 可以稍微清理一下。在 `sizeof` 中使用 `outPtr` 的类型