如何在主函数中分配指针?

我刚开始学习编程语言 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` 的类型

以上是如何在主函数中分配指针?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>