Cấp phát động trong C (uint8_t)

e đang có bài toán nhờ m.n giúp ạ, e xin cảm ơn
Viết chương trình cấp phát bộ nhớ động 10 bytes cho 1 con trỏ, với mẫu hàm được cung cấp như sau:

#include <stdint.h>

#include <stdbool.h>

bool allocate10Bytes(uint8_t *outPtr);
  • outPtr: output pointer
  • return: true: Nếu cấp phát thành công.
    false: Nếu cấp phát bị lỗi.

Yêu cầu:

Không được thay đổi bất kỳ yêu cầu nào của đề, ví dụ đề yêu cầu viết hàm:

bool allocate10Bytes(uint8_t *outPtr);

Học viên viết hàm allocate10bytes(uint8_t *outPtr); -> không viết hoa “b” -> vi phạm yêu cầu của đề bài và sẽ bị 0 điểm.

Cậu làm được gì rồi? Và cậu cần bọn tớ giúp gì nào? :smile:

3 Likes

e đang bí hướng giảm quyết bài toán ạ, khi e truyền vào hàm 1 địa chỉ con trỏ, sau khi hàm cấp phát động thì địa chỉ của con trỏ sẽ thay đổi, làm s để e có thể lấy được giá trị của địa chỉ được cấp phát ạ

1 Like

Bạn truyền vào là địa chỉ của con trỏ.
Vào trong hàm bạn cấp phát 1 vùng nhớ và trả về 1 địa chỉ của vùng nhớ.
Bạn để con trỏ trỏ tới địa chỉ vùng nhớ mới được cấp phát.
Cuối cùng bạn có thứ bạn muốn.

Vậy bạn đã hiểu con trỏ là gì chưa?
Bạn phân biệt được địa chỉgiá trị của con trỏ chưa?

3 Likes

cách này mình đã thử, nhưng chỉ đúng với kiểu int, còn uint8_t thì bị lỗi,

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
void allocate_memory(int *ptr)
{
    int *ptr2;
    int i;
    ptr2 = (int *)calloc(5, sizeof(int));
    printf("Nhap cac gia tri:\n");
    for (i = 0; i < 5; ++i)
    {
        printf("phan tu thu %d:", i + 1);
        scanf("%d", ptr2 + i);
    }
    for (i = 0; i < 5; ++i)
    {
        printf("\ndia chi %x:", ptr2 + i);
    }
    printf("\ngia tri trong ham 1:%d\n", ptr2);
    *ptr = ptr2;
    printf("\ngia tri trong ham 1:%d\n", ptr);
}
int main()
{
    int *word;
    allocate_memory(&word);
    printf("gia tri trong ham 1:%d\n", word);
    int i;
    for (i = 0; i < 5; i++)
    {
        printf("%d----%x\n", *(word + i), (word + i));
    }
    free(word);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
void allocate_memory(uint8_t *ptr)
{
    uint8_t *ptr2;
    uint8_t i;
    ptr2 = (uint8_t *)calloc(5, sizeof(uint8_t));
    printf("Nhap cac gia tri:\n");
    for (i = 0; i < 5; ++i)
    {
        printf("phan tu thu %d:", i + 1);
        scanf("%d", ptr2 + i);
    }
    for (i = 0; i < 5; ++i)
    {
        printf("\ndia chi %x:", ptr2 + i);
    }
    printf("\ngia tri trong ham 1:%d\n", ptr2);
    *ptr = ptr2;
    printf("\ngia tri trong ham 1:%d\n", ptr);
}
int main()
{
    uint8_t *word;
    allocate_memory(&word);
    printf("gia tri trong ham 1:%d\n", word);
    uint8_t i;
    for (i = 0; i < 5; i++)
    {
        printf("%d----%x\n", *(word + i), (word + i));
    }
    free(word);
    return 0;

đổi qua uint8_t thì sai ạ

1 Like

Đề bài đầy đủ đâu bạn?
Mình thấy yêu cầu chỉ là cấp phát 10 byte và đúng 10 byte thôi.
Kiểu uint8_t có kích thước là 1 byte (8 bit). Bạn chỉ cần cấp phát 10 ô nhớ và gán vào outPtr và trả về true là xong. Trong trường hợp cấp phát không thành công (do đầy bộ nhớ) thì trả về false thôi.
Đề bài có yêu cầu nhập cái gì và có liên quan gì đến số 5 không mà thấy bạn toàn dùng số 5 không vậy?

2 Likes

Bạn thử đọc link này xem: https://stackoverflow.com/questions/1398307/how-can-i-allocate-memory-and-return-it-via-a-pointer-parameter-to-the-calling

Việc này cũng tương tự như yêu cầu viết hàm swap 2 biến a, b

void swap(int a, int b) // Không thể swap 2 biến
void swap(int *a, int *b)

Bạn không thể thay đổi giá trị a, b nếu không truyền con trỏ vào.
Vậy nếu bạn muốn swap 2 con trỏ thì hàm swap sẽ là gì?

3 Likes

Nếu tôi không hiểu nhầm thì đề bài là viết hàm này.

bool allocate10Bytes(uint8_t *outPtr);

Mục đích là cấp phát vùng nhớ cho 1 con trỏ đã khai báo trước đó:

uint8_t *myPtr = NULL;
bool res = allocate10Bytes(myPtr);

Nếu đúng thì cái format của cái hàm kia sai và chẳng thể hoạt động được đâu. Format hàm là truyền tham trị của con trỏ (pass by value).
=> outPtr là bản copy của myPtr
=> giá trị của 2 thằng sau khi copy là không ràng buộc
=> dù có làm cái gì với cái giá trị của outPtr thì cái giá trị bên ngoài của myPtr cũng không hề thay đổi
=> Mâu thuẫn ngay từ đề bài.


Format hàm đúng theo yêu cầu :

bool allocate10Bytes(uint8_t **outPtr); // 2 dấu sao -> truyền tham chiếu của con trỏ (pass by reference)

Cách dùng :

uint8_t *myPtr = NULL;
bool res = allocate10Bytes(&myPtr); // dấu & để lấy tham chiếu của con trỏ.

Trong thân hàm :

outPtr[0] =  malloc(......);
// hoặc
// *outPtr =  malloc(......);
// outPtr[0] hoặc *outPtr là lấy giá trị của outPtr -> chính là myPtr bên ngoài

// do something ...
6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?