gpt4 book ai didi

c - sprintf 的段错误

转载 作者:行者123 更新时间:2023-11-30 15:58:19 25 4
gpt4 key购买 nike

我正在制作一个 makefile 创建器,但我在 sprintf 上遇到了这个错误,最奇怪的是我在出现错误的之前有多个 sprintf 并且它们工作正常。

代码如下:

if ( WIFEXITED(stat)  ){

if ( WEXITSTATUS(stat) ) {

if ( cFiles == 0 && cFolders == 0 ) {
Crear(path);
}

cFolders = 1;
TEMP = malloc( sizeof(char)*( strlen(direntp->d_name) + 25 ) );

if ( TEMP == NULL ) {
perror("Malloc Error: ");
exit(1);
}

if ( sprintf(TEMP, "\n%s/%s.a: force\n\t$(MAKE) -C %s\n",direntp->d_name, direntp->d_name, direntp->d_name) < 0 ) {
perror("Sprintf Error: ");
exit(1);
}

write(STDOUT_FILENO,TEMP,strlen(TEMP));
f.name = malloc( sizeof(char)*( strlen(direntp->d_name)*2 + 3 ) );

if ( f.name = NULL ) {
perror("Malloc Error: ");
exit(1);
}
//This is the one with the problem!!!
if ( sprintf(f.name, "%s/%s.a", direntp->d_name, direntp->d_name) < 0 ) {
perror("Sprintf Error: ");
exit(1);
}

l = AddToList(l,&f);
}
}

最佳答案

您分配的 TEMP 似乎不够大

TEMP = malloc( sizeof(char)*( strlen(direntp->d_name) + 25 ) );

应该是:

TEMP = malloc( sizeof(char)*( strlen(direntp->d_name)*3 + 25 + 1 ) );

您正在打印 d_name 三次,并且还需要一个额外的字节作为空终止符。

同样,在这一行:

   f.name = malloc( sizeof(char)*( strlen(direntp->d_name)*2 + 3 ) );

应该是

   f.name = malloc( sizeof(char)*( strlen(direntp->d_name)*2 + 3 + 1) );

考虑空终止符。

使用这样的断言可以帮助确保您的计算正确:

    int TEMP_size = strlen(direntp->d_name)*3 + 25 + 1; 
TEMP = malloc(sizeof(char)*TEMP_size);

if ( TEMP == NULL ) {
perror("Malloc Error: ");
exit(1);
}

if ( sprintf(TEMP, "\n%s/%s.a: force\n\t$(MAKE) -C %s\n",direntp->d_name, direntp->d_name, direntp->d_name) < 0 ) {
perror("Sprintf Error: ");
exit(1);
}
assert(strlen(TEMP)+1==TEMP_size);

关于c - sprintf 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9858240/

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