【问题标题】:Incompatible integer to pointer conversion assigning to 'char *' from 'int'从“int”分配给“char *”的不兼容整数到指针转换
【发布时间】:2012-12-08 23:04:36
【问题描述】:

下面的代码因 EXC_BAD_ACCESS 而崩溃。有人知道为什么吗?

报告以下警告:

不兼容的整数到指针转换从'int'分配给'char *'

register int t;
char *s;
double val;

s = printn(val);
t = strlen(s); // <<< breaks on this line

...

char *printn(n)
double n;
{
    register char *fmt, *s, *ss;
    double absn;
    short sign;

    ....
    s = printb("%-0.2f", sign*absn);
    for (ss = s; *ss; ++ss);
    while (*--ss == '0' || *ss == ' ') *ss = 0;
    if (*ss == '.') *ss = 0;

    return(s);
}

谢谢。

【问题讨论】:

  • register? K&R 风格的函数定义?又是 1982 年吗?
  • 关闭!这段代码其实是1983年的
  • 啊,1983年,sizeof(char*) == sizeof(int)的机会很大。在这种情况下,代码的工作机会并不大。

标签: c


【解决方案1】:
char *s;
double val;

s = printn(val);

此时,printn 的声明不在范围内。因此,使用旧 C89 规则的编译器假定 printn 的隐式声明返回 int

在使用之前声明所有函数。

char *printn(double n);
char *s;
double val;
// ..
s = printn(val);

这样会行。

char *printn(n)
double n;
{

请使用现代语法,

char * printn(double n)
{
    // implementation

【讨论】:

  • 这行得通。非常感谢您的解释和帮助。
猜你喜欢
  • 2011-07-14
  • 2021-12-16
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多