linux c 64 int32,c - 32位C程序不再在64位OS Linux上将char转换为int - 堆栈内存溢出

本文详细讲述了如何修复并简化C语言中的findX函数,着重于内存管理错误、printf格式修正,并提出更高效的代码实现。作者强调了代码审查中常遇到的陷阱和正确编程实践的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

您的代码的正确版本是:

int findX(char *whereisX, int *rW, int *rH)

{

printf("entering findx dia is %s\n\n", whereisX);

char *tok1, *tok2, *saveptr;

char *str1 = (char*)malloc(1 + strlen(whereisX));

int bW, bH;

strcpy(str1, whereisX);

tok1 = strtok_k(whereisX, "x", &saveptr);

tok2 = strtok_k(NULL, "x", &saveptr);

if (tok2 == NULL)

{

printf("found return 1\n");

free(str1);

return 1;

}

else

{

printf("returning 0\n");

tok1 = strtok_k(str1, "x", &saveptr);

tok2 = strtok_k(NULL, "x", &saveptr);

printf("tok1 is .. %s and tok2 is %s\n", tok1, tok2);

bW = atoi(tok1);

bH = atoi(tok2);

printf("bW is %d and bH is %d\n", bW, bH);

/* assigning the results to the output */

*rW = bW;

*rH = bH;

printf("rW is %d rH is %d\n", *rW, *rH);

printf("tok1 is %s tok2 is %s\n", tok1, tok2);

free(str1);

return 0;

}

} //end findX

请注意不同之处:您以完全错误的方式使用malloc ,以完全错误的方式使用了printf格式标识符,没有free分配的字符串。

我还要补充一点,您执行了strtok_r两次(一次在if外,一次在if )。 两者将返回相同的数据,因为str1是whereisX的副本

然后可以将代码简化为:

int findX(char *whereisX, int *rW, int *rH)

{

printf("entering findx dia is %s\n\n", whereisX);

char *tok1, *tok2, *saveptr;

int bW, bH;

tok1 = strtok_k(whereisX, "x", &saveptr);

tok2 = strtok_k(NULL, "x", &saveptr);

if (tok2 == NULL)

{

printf("found return 1\n");

return 1;

}

else

{

printf("returning 0\n");

printf("tok1 is .. %s and tok2 is %s\n", tok1, tok2);

bW = atoi(tok1);

bH = atoi(tok2);

printf("bW is %d and bH is %d\n", bW, bH);

// printf("string -- bW is %s and bH is %s\n", bW,bH);

/* assigning the results to the output */

*rW = bW;

*rH = bH;

printf("rW is %d rH is %d\n", *rW, *rH);

printf("tok1 is %s tok2 is %s\n", tok1, tok2);

return 0;

}

} //end findX

用C编写的随机程序有时会返回似乎正确的东西这一事实并不意味着它们是正确的。 这仅意味着您很幸运。 这种运气不会永远持续下去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值