gpt4 book ai didi

c - 即使分配后,结构指针仍保持为 NULL

转载 作者:行者123 更新时间:2023-11-30 14:48:32 26 4
gpt4 key购买 nike

我试图从函数返回一个 Tuple 结构,但它似乎没有更新分配给它的指针。

例如,如果我在返回元组之前查看它的值,我会发现它已正确分配:

342        Tuple *t = create_tuple();
(gdb)
345 memcpy(t->part1, cwd, i + 1);
(gdb) p t
$5 = (Tuple *) 0x605010
(gdb) n
346 memcpy(t->part2, &cwd[i + 1], cwd_len - i - 1);
(gdb)
348 return t;

但是在分配它之后,我分配给它的元组指针看起来仍然是 NULL:

291              if ((partitioned = split_prefix(cwd, strlen(cwd))) == NULL)
(gdb) p partitioned
$11 = (Tuple *) 0x0
(gdb) n
296 memcpy(name_field, partitioned->part1, strlen(partitioned-
>part1));
(gdb) p partitioned
$12 = (Tuple *) 0x0

我认为,既然我返回的指针不是 NULL,那么应该没问题,所以我对如何在调用之前和之后使用 NULL 指针感到困惑。也许我错误地初始化了指针?

这是结构指针返回到的函数:

// gets name field and returns TRUE if successful, otherwise FALSE
int get_name_field(Tuple *partitioned, char name_field[], char *fname, char *cwd, int cwd_len)
{
// fname cannot be broken up
if (strlen(fname) > 155)
{
perror(fname);
return FALSE;
}
// there is a path (prefix)
else if (cwd)
{
// fname field isn't long enough
if (strlen(cwd) + 1 + strlen(fname) > 100)
{
// ***********assignment here**************
if ((partitioned = split_prefix(cwd, strlen(cwd))) == NULL)
{
perror("partition failed");
return FALSE;
}
memcpy(name_field, partitioned->part1, strlen(partitioned->part1));
}
...

返回元组指针的函数:

// return a the part of prefix that fits in name field, and the remainder
// if no delimiter is found, returns null
Tuple *split_prefix(char *cwd, int cwd_len)
{
// find last '/' delimiter that is within NAME_LEN range
int found = 0;
int i = cwd_len <= 100 ? cwd_len - 1: NAME_LEN;
for (; i > -1; i--)
{
if (cwd[i] == '/')
{
found = TRUE;
break;
}
}

// no delimiter found
if (!found)
{
return NULL;
}
// too long to be stored in overflow
else if (cwd_len - i > PREFIX_LEN)
{
return NULL;
}

// **********Tuple created here************
Tuple *t = create_tuple();

// make partitions
memcpy(t->part1, cwd, i + 1);
memcpy(t->part2, &cwd[i + 1], cwd_len - i - 1);

return t;
}

元组的定义:

#define NAME_LEN 100
#define PREFIX_LEN 155

// holds partioned strings of prefix
typedef struct Tuple
{
char part1[NAME_LEN];
char part2[PREFIX_LEN];
} Tuple;

创建元组:

// create a tuple with default values
Tuple *create_tuple(void)
{
Tuple *t = malloc(sizeof(Tuple));
memset(t->part1, '\0', NAME_LEN);
memset(t->part2, '\0', PREFIX_LEN);

return t;
}

编辑:调用 get_name_field 的函数:

void test_get_name_field3(void)
{
Tuple *partitioned = NULL;
char name_field[NAME_LEN] = {'\0'};
char *fname = "hellobutunfortunatelythiswon'tfit.txt";
char *cwd = "user/bin/arafian/ratherlongdirectorynameandwillnot/fitin"
"thenamefieldonlysoitwilloverflowtotheprefixfield";
int cwd_len = strlen(cwd);

get_name_field(partitioned, name_field, fname, cwd, cwd_len);
char *result = "user/bin/arafian/ratherlongdirectorynameandwillnot/";
checkit_string(name_field, result);
free(partitioned);
}

最佳答案

如果要通过函数的参数返回指针,则该函数必须采用双指针作为参数。 IE。 int get_name_field(Tuple **partition, ...) { 并像 get_name_field(&partition, ...) 那样调用。

这与我最近在这里回答的问题完全相同 https://stackoverflow.com/a/50261485/982257可能还有其他几个。

关于c - 即使分配后,结构指针仍保持为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50339566/

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