gpt4 book ai didi

c - C 中数据被覆盖的内存问题

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

我有以下程序:

// required include statements...

static char ***out;

char* get_parameter(char* key)
{
char *querystr = /*getenv("QUERY_STRING")*/ "abcdefg=abcdefghi";
if (querystr == NULL)
return (void*)0;

char s[strlen(querystr)] ;
strcpy(s, querystr);
const char delim = '&';
const char delim2 = '=';
static size_t size = 0;
if (out == 0)
{
out = (char*) malloc(sizeof(char*));
size = split(s, &delim, out);
}

int i=0;
for (; i<size; i++)
{
if ((*out)[i] != NULL)
{
char ***iout = NULL;
iout = (char*) malloc(sizeof(char*));
int isize = split((*out)[i], &delim2, iout);

if (isize > 1 && ((*iout)[1]) != NULL && strcmp(key, (*iout)[0]) == 0)
{
size_t _size = strlen((*iout)[1]);
char* value = (char*) malloc(_size*sizeof(char));
strcpy(value, (*iout)[1]);
free(iout);
return value;
}
}
}
return (void*) 0;
}

static size_t count(const char *str, char ch)
{
if (str == NULL) return 0;
size_t count = 1;
while (*str)
if (*str++ == ch) count++;
return count;
}

size_t split(const char *const str, const char* delim, char ***out)
{
size_t size = count(str, *delim);
*out = calloc(size, sizeof(char));
char* token = NULL;
char* tmp = (char*) str;
int i=0;
while ((token = strtok(tmp, delim)) != NULL)
{
tmp = NULL;
(*out)[i] = (char*) malloc(sizeof strlen(token));
strcpy((*out)[i++], token);
}
return size;
}

main()
{
char* val = get_parameter("abcdefg");
printf("%s\n", val); // it should prints `abcdefghi`, but it prints `abcd?`
free(val);
}

在 main 方法中出现,函数 get_parameter 应该打印 abcdefghi,但它打印 abcd? 其中 ? 是一个控制字符值为 17。

为什么不打印字符串的重置?我想我误用了 malloc 来分配适当的空间。

此外,是否有任何工具可用于了解指针的内存内部表示?

最佳答案

您在这里处理的是 C 字符串。您必须为 NULL 终止符 ('\0') 考虑 1 个额外的字节

因此:

char s[strlen(querystr)] ;
strcpy(s, querystr);

不正确。

strlen 将为字符串“abcd”返回 4,但您想要的是为“abcd\0”分配空间

所以你需要strlen + 1

关于c - C 中数据被覆盖的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054404/

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