gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:45 26 4
gpt4 key购买 nike

根据 this answer , 常量不应该被删除,因为它们可能一开始就没有分配。但是,在某些情况下我想保护动态分配的数据。例如,在管理用户 session 时,我想确保像当前用户名这样的数据不会被其他函数意外覆盖,但是 session 数据确实是在解析它们时分配的请求。

这是一个代码示例,可以让您更好地理解。不过请记住,事情已经大大简化了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


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, "last-name") + strlen("last-name") + 1;

char *username = malloc(10);
memcpy(username, first_name, 4);
username[4] = ' ';
memcpy(username + 5, last_name, 4);

/* The returned string is "SOME DUDE" */
return username;
}

int main(void) {
char *username = get_username_from_request(request);
printf("Welcome, %s.\n", username);
free(username);
return 0;
}

我真的想改用 const char *username = get_username_from_request(request);,但是当我进行此更改时 Clang 发出警告:

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/nalzok/CLionProjects/zero/cmake-build-debug --target zero -- -j 2
Scanning dependencies of target zero
[ 50%] Building C object CMakeFiles/zero.dir/main.c.o
/Users/nalzok/CLionProjects/zero/main.c:24:10: warning: passing 'const char *' to parameter of type 'void *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
free(username);
^~~~~~~~
/usr/include/stdlib.h:151:18: note: passing argument to parameter here
void free(void *);
^
1 warning generated.
[100%] Linking C executable zero
[100%] Built target zero

任何想法都会受到赞赏。

†​​:嗯,believe it or not ,我正在用 C 编写 Web 应用程序。

最佳答案

首先,您必须明白,没有什么可以阻止您的编译代码覆盖任何数据,无论是否声明为 constconst 的正确性仍然可以帮助您发现代码中的逻辑错误,因此这是个好主意。

对于您的具体问题,我建议在此处隐藏一些类似于 OOP 的信息。你可以例如像这样模拟用户 session :

session.h:

#ifndef SESSION_H
#define SESSION_H

typedef struct Session Session;

Session *Session_create(void);
int Session_setUsername(Session *self, const char *username);
const char *Session_Username(const Session *self);
void Session_destroy(Session *self);

#endif

session.c:

#include <stdlib.h>
#include <string.h>
#include "session.h"

struct Session
{
char *username;
};

Session *Session_create(void)
{
Session *self = calloc(1, sizeof *self);
return self;
}

int Session_setUsername(Session *self, const char *username)
{
free(self->username);
self->username = malloc(strlen(username) + 1);
if (!self->username) return -1;
strcpy(self->username, username);
return 0;
}

const char *Session_Username(const Session *self)
{
return self->username;
}

void Session_destroy(Session *self)
{
if (!self) return;
free(self->username);
free(self);
}

现在,如果您的代码中有一个const Session *,您将无法操作任何 session 数据。您只能得到一个指向您的用户名的 const 指针。

关于c - 如何对动态分配的数据进行 const 限定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51513615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com