cuốn sách gpt4 ai đã làm

c - 如何对动态分配的数据进行 const 限定?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 02:25:45 26 4
mua khóa gpt4 Nike

theo câu trả lời này , các hằng số không nên bị xóa vì chúng có thể chưa được phân bổ ngay từ đầu. Tuy nhiên, có những trường hợp tôi muốn bảo vệ dữ liệu được phân bổ động. Ví dụ: khi quản lý phiên người dùng, Tôi muốn đảm bảo rằng dữ liệu như tên người dùng hiện tại không bị các hàm khác vô tình ghi đè mà dữ liệu phiên thực sự được phân bổ theo yêu cầu khi phân tích cú pháp chúng.

Đây là một ví dụ về mã để bạn hiểu rõ hơn. Tuy nhiên, hãy nhớ rằng mọi thứ đã được đơn giản hóa rất nhiều.

#include 
#include
#include


const char *request = "www.example.com/index?first-name=SOME&last-name=DUDE";

char *get_username_from_request(const char *req) {
char *first_name = strstr(req, "first-name") + strlen("first-name") + 1;
char *last_name = strstr(req, "họ") + strlen("họ") + 1;

char *tên người dùng = malloc(10);
memcpy(tên người dùng, first_name, 4);
tên người dùng[4] = ' ';
memcpy(tên người dùng + 5, họ_tên, 4);

/* Chuỗi trả về là "SOME DUDE" */
trả lại tên người dùng;
}

int chính(void) {
char *tên người dùng = get_username_from_request(request);
printf("Chào mừng, %s.\n", tên người dùng);
miễn phí(tên người dùng);
return 0;
}

Tôi thực sự muốn sử dụng const char *tên người dùng = get_username_from_request(request);, nhưng khi tôi thực hiện thay đổi này, Clang đưa ra cảnh báo:

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/nalzok/CLionProjects/zero/cmake-build-debug --target zero -- -j 2
Quét phụ thuộc của mục tiêu số 0
[50%] Đối tượng xây dựng C CMakeFiles/zero.dir/main.co
/Users/nalzok/CLionProjects/zero/main.c:24:10: cảnh báo: chuyển 'const char *' tới tham số của loại 'void *' loại bỏ vòng loại [-Wintương thích-con trỏ-loại-loại bỏ-qualifier]
miễn phí(tên người dùng);
^~~~~~~~~
/usr/include/stdlib.h:151:18: lưu ý: truyền đối số cho tham số tại đây
không có giá trị(void *);
^
1 cảnh báo được tạo ra.
[100%] Liên kết C thực thi bằng 0
[100%] Đã xây dựng mục tiêu bằng 0

Mọi ý tưởng sẽ được đánh giá cao.

†:Ừm,tin hay không , Tôi đang viết một ứng dụng web bằng C.

câu trả lời hay nhất

Trước tiên, bạn phải hiểu rằng không có gì ngăn cản mã được biên dịch của bạn ghi đè bất kỳ dữ liệu nào, cho dù được khai báo là const. const Tính chính xác vẫn có thể giúp bạn tìm ra lỗi logic trong mã của mình, vì vậy đó là một ý tưởng hay.

Đối với vấn đề cụ thể của bạn, tôi khuyên bạn nên ẩn một số thông tin giống OOP tại đây. Ví dụ: bạn có thể mô phỏng phiên người dùng như thế này:

phiên.h:

#ifndef SESSION_H
#xác định SESSION_H

Phiên phiên cấu trúc typedef;

Phiên *Session_create(void);
int Session_setUsername(Phiên *self, const char *tên người dùng);
const char *Session_Username(const Session *self);
void Session_destroy(Phiên *tự);

#endif

phiên.c:

#include 
#include
#include "session.h"

phiên cấu trúc
{
char *tên người dùng;
};

Phiên *Session_create(void)
{
Phiên *self = calloc(1, sizeof *self);
return self;
}

int Session_setUsername(Phiên *self, const char *tên người dùng)
{
miễn phí(tự->tên người dùng);
self->tên người dùng = malloc(strlen(tên người dùng) + 1);
if (!self->tên người dùng) trả về -1;
strcpy(self->tên người dùng, tên người dùng);
return 0;
}

const char *Session_Username(const Session *self)
{
tự trả về->tên người dùng;
}

void Session_destroy(Phiên *tự)
{
if (!self) trả về;
miễn phí(tự->tên người dùng);
miễn phí (tự);
}

Bây giờ, nếu mã của bạn cóphiên const *, bạn sẽ không thể thao tác bất kỳ dữ liệu phiên nào. Bạn chỉ có thể nhận được một điểm trỏ đến tên người dùng của bạn const 指针。

Giới thiệu về c - Làm cách nào để đủ điều kiện phân bổ dữ liệu động? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/51513615/

26 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress