gpt4 book ai didi

在源代码中创建字符串数组在可执行文件中不起作用

转载 作者:行者123 更新时间:2023-11-30 21:12:50 25 4
gpt4 key购买 nike

我有一些代码可以生成不同文件名的字符串数组,然后将它们传递到一个函数中以向它们写入一些数据。它将递增的数字添加到从输入参数提供的起始文件名中。

问题是它在 Visual Studio 2012 中从源代码运行得很好,但是当我编译它并将其作为 .exe 运行时,程序崩溃了。.exe 似乎没有正确传递字符串数组,这在尝试使用字符串时导致错误用于打开文件等。

这是独立的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <stdint.h>
#include <Windows.h>


void processing_function(int num_output, char **outnames)
{
/* in Visual Studio this works fine and prints all
the names correctly. Running from .exe will crash */
for(int idx = 0; idx <num_output;idx++)
{
printf("outnames[%d] is %s\n",idx,outnames[idx]);
}

}

int main(int argc, char *argv[])
{
/*nframes comes from another function, outname comes from input arguement */
int num_output = ceil(((double)*nframes / 1100));
int outname_len = strlen(outname)+1;
char *out_right;
out_right = (char*) malloc(sizeof(char)*outname_len);

/*Split string to append numbers before file extension */
strcpy(out_right,outname);
strrev(out_right);
strtok(out_right,".");
strcat(out_right,".");
strrev(out_right);
int out_right_len = strlen(out_right);
strtok(outname,".");
strcat(outname,"-");
int out_origlen = strlen(outname);
int num_len = 1;
char **outnames;
char *num;
char *outname_tmp;
outnames = (char**) malloc(sizeof(char)*(num_output));
int out_len;
double dbl_idx;
int *numfs = (int*)malloc(sizeof(int)*num_output);
for(int idx = 1;idx <num_output+1;idx++)
{
/*convert output number to string and stitch complete name back together and place into array */
num_len = ceil(log10((double)idx+0.1));
num = (char*) malloc(sizeof(char)*(num_len+1));
outname_tmp = (char*) malloc(sizeof(char)*(out_origlen+num_len+out_right_len+1));
strcpy(outname_tmp,outname);
sprintf(num,"%d",idx);
strcat(outname_tmp,num);
free(num);
strcat(outname_tmp,out_right);
outnames[idx-1] = (char*) malloc(sizeof(char)*(out_origlen+num_len+out_right_len+1));
strcpy(outnames[idx-1],outname_tmp);
free(outname_tmp);
printf("%s\n",outnames[idx-1]);
}
free(out_right);

processing_function(num_ouput, outnames)

return(0);

}

编辑:将 num_input 更改为 num_output,因为它们具有相同的值。

从 .exe 运行有时会开始打印一些名称,然后崩溃,打开调试器在 output.c 中给出错误,并出现访问读取冲突。我尝试将此代码放在processing_function 的顶部,但这给下游带来了进一步的问题(堆损坏),这让我认为代码弄乱了内存,但我看不出它出了什么问题,也不知道为什么它可以在 VS 中运行,但不能作为 .exe 运行。

我可以尝试通过在每次需要时动态生成下一个输出名称来避免这个问题,但我真的更想知道为什么这不起作用。

任何帮助将不胜感激。

最佳答案

我要尝试一下,你将 num_input 传递给 processing_function(),并使用 outnames, outnames 已分配了 num_output 大小,但 num_inputnum_output 在运行时具有不同的值。这样就可以让 processing_function() 访问越界。

关于在源代码中创建字符串数组在可执行文件中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31793770/

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