gpt4 book ai didi

c - 向变量追加新路径会使程序崩溃

转载 作者:行者123 更新时间:2023-11-30 19:29:04 24 4
gpt4 key购买 nike

我有一个函数,可以将目录添加到定义的路径中,或多或少,与命令提示符中的“cd-function”完全相同。第一次添加目录时一切正常,第二次或第三次(取决于目录的长度)程序崩溃。

char path[PATH_MAX];

void dir_forward(char cmd[])
{
char *temp = malloc(strlen(path) + strlen(cmd) + 2);
char sep[] = "\\";

strcpy(temp, path); // copy path to temp

strcat(temp, sep);
strcat(temp, cmd+3); // +3 for removing "cd " from string

int i = strlen(temp); // add null terminator
temp[i] = '\0';

strcpy(path, temp);

free(temp);
printf("%s\n", path);
}

程序首先将路径复制到一个临时变量(临时变量的大小由路径的大小、新目录、一个反斜杠和一个空终止符确定)。之后,反斜杠和新目录被复制到临时变量中的路径。空终止符附加到字符串的末尾。之后,临时变量中的新路径将被复制到该路径中,从而替换旧路径。

让我用一个例子来演示,我有:

C:\Users\Paul\Desktop\some_folder

我决定将文件夹“images”附加到路径中:

C:\Users\Paul\Desktop\some_folder\images

如果我再追加一个文件夹(最好使用长名称),程序将崩溃,几乎就像缓冲区溢出一样,并且还会以一些奇怪的字符结束路径。

[编辑]

我无法完全重现该代码,因为它相当大,但是,下面是该函数的本质。首先,程序借助 getcwd() 将路径添加到变量路径,然后接受输入并将其发送到上面的函数。

int main(void)
{
char cmd[30];

getcwd(path, PATH_MAX); // Get current path
scanf("%s", cmd);
dir_forward(cmd);
}

这应该足以重现我猜想的问题。

最佳答案

发布的代码失败的原因并不明显,但这里的规则#1 是在复制之前始终检查数据的大小。另外,通过删除malloc可以简化整个功能。例如:

void dir_forward (const char cmd[])
{
cmd += sizeof("cd ") - 1; // remove "cd "

size_t dst_length = strlen(path);
size_t src_length = strlen(cmd);
size_t new_length = dstr_length + src_length + 2; // '\\' and '\0' give +2
if(new_length > PATH_MAX)
{
exit(EXIT_FAILURE);
}

char* ptr = &path[dst_length]; // point at null terminator

memcpy(ptr, cmd, src_length);
ptr += src_length;

*ptr = '\\';
ptr++;

*ptr = '\0';
}

完整示例:

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

#ifndef PATH_MAX
#define PATH_MAX 255
#endif

static char path[PATH_MAX] = "C:\\tmp\\";

void dir_forward (const char cmd[])
{
cmd += sizeof("cd ") - 1; // remove "cd "

size_t dst_length = strlen(path);
size_t src_length = strlen(cmd);
size_t new_length = dstr_length + src_length + 2; // '\\' and '\0' give +2
if(new_length > PATH_MAX)
{
exit(EXIT_FAILURE);
}

char* ptr = &path[dst_length]; // point at null terminator

memcpy(ptr, cmd, src_length);
ptr += src_length;

*ptr = '\\';
ptr++;

*ptr = '\0';
}

int main (void)
{
dir_forward("cd foo");
puts(path);
}

关于c - 向变量追加新路径会使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53294651/

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