gpt4 book ai didi

c - 为 C 结构中的 char* 属性分配内存

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:42 24 4
gpt4 key购买 nike

假设我们在 C 文件中有以下结构定义:

typedef struct {
char *name;
int id;
int last_cpu;
} thread_t;

(这是我正在编写的模拟,用于为我的操作系统类使用不同的调度算法)。每次我创建一个新的 thread_t 结构时,我如何处理其中一个变量是 char* 的事实?例如,我的代码中有以下方法:

thread_t **get_starting_thread_list() {
thread_t **threads = (thread_t **) malloc(MAX_NUM_THREADS * sizeof(thread *));
int next_id = 0;

for (int th_num = 0; th_num < MAX_NUM_THREADS; th_num++) {
thread_t *new_thread = (thread_t *) malloc(sizeof(thread_t));
new_thread->name = "New thread";
new_thread->id = ++next_id;
new_thread->last_cpu = 0;
threads[th_num] = new_thread;
}

return threads;
}

如果 new_threadname 字段“太大”,我可能会遇到段错误吗?也就是说,我应该在分配之前为线程名称分配额外的内存吗?我试过运行它,它似乎运行良好,但我担心它稍后可能会中断。

最佳答案

Could I potentially get a Segmentation Fault if the name field of new_thread is ever "too big"?

不,无论字符串有多长,都不会出现段错误,因为字符串文字的内存是静态分配的,永远不会被复制。

That is, should I be allocating additional memory for the thread name before assigning it?

除非您打算更改名称,否则不会。如果您想让名称保持指向字符串文字,您的代码就完全没问题。如果您想对名称使用非文字数据,请执行以下操作:

char buf[32];
sprintf(buf, "New thread %d", next_id);
new_thread->name = malloc(strlen(buf+1));
strcpy(new_thread->name, buf);

现在您需要在取消分配线程之前调用free(threads[i]->name)

I've tried running this and it seems to be behaving fine, but I'm afraid that it could potentially break later on.

您的代码没问题。您始终可以使用内存分析器(例如 valgrind)来检查无效访问。

关于c - 为 C 结构中的 char* 属性分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940017/

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