gpt4 book ai didi

c - 仅在初始执行时出现段错误。段错误的原因似乎改变了

转载 作者:太空宇宙 更新时间:2023-11-04 08:20:35 24 4
gpt4 key购买 nike

这个问题与 BeagleBone Black 上的 PWM 模块直接相关。这里有两个与此相关的问题,但他们没有提供答案,而是提供了替代方案,在我看来,这些替代方案更加困惑和不必要。

以下代码是用于启动和调整 PWM 信号的众多函数之一。该代码有一个警告,在初始执行时会发生段错误。之后的每次执行都没有问题。该函数在另一个程序开始时被调用以设置 PWM 信号。使用 gdb 我已将问题缩小到 fseek()/fprintf() 函数。最初 SIGSEGV 是从 fseek() 收到的,但是在阅读了一些内容后,我决定将其注释掉。然后 SIGSEGV 由 fprintf() 生成。

我真的不确定为什么会发生这种情况,因为有两个其他函数具有完全相同的设置,在此之前执行并且不会导致段错误。

请看一看,如果有什么特别之处请告诉我。如有必要,我可以发布其他代码。

int setPWMPeriod(int helpnum, char* pin, int period)
{
FILE *pwm;
char buf[5];
char buf2[60] = "/sys/devices/ocp.3/pwm_test_";

//build file path
sprintf(buf,"%i",helpnum);
printf("%s\n",pin);
strcat(buf2,pin);
strcat(buf2,".");
strcat(buf2,strcat(buf,"/period"));

printf("%s\n",buf2);
pwm = fopen(buf2, "w");
if(pwm == NULL) printf("PWM Period failed to open\n");
fflush(pwm);
//fseek(pwm,0,SEEK_SET);
fprintf(pwm,"%d",period);
fflush(pwm);
fclose(pwm);

return 0;
}

编辑:一些附加信息。 helpnum = "15", pin = "P8_13"

最佳答案

您声明了一个可以容纳 4 个字符的字符串的缓冲区(加上 \0):

char buf[5];

向其中打印一个 int,我们希望它的长度不超过 4 个字符

sprintf(buf,"%i",helpnum);

然后追加7个字符:

strcat(buf2,    /* ---> */ strcat(buf,"/period")   /* <--- */  );

溢出缓冲区,这样任何事情都有可能发生。也许我们只是开始覆盖 buf2,也许我们覆盖 pwm,也许我们丢弃了堆栈...

使 buf 与最长的 int + "/period" 字符串一样大,加 1。

关于c - 仅在初始执行时出现段错误。段错误的原因似乎改变了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33621403/

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