怎么消除这个警告?assignment makes integer from pointer without a cast

dfczj 2007-05-21 12:39:05
void mm(char *p)
{
char b[]="test1\0";//这一行[Warning] assignment makes integer from pointer without a cast
*p =b ;
}

int main(void){
char a[]="first\0";
char *str ;
str=a;
mm(str);
printf("%s\n",str);
system("PAUSE");
return 0;
}

执行结果还是first,而非test,高手帮我解答一下,为什么会这样,怎样才打出test?



...全文
8259 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyu2202863 2007-05-21
  • 打赏
  • 举报
回复
在c中,自动变量在堆栈中分配内存,当包含自动变量的函数或代码块退出时,它们所占用的内存便被回收,他们的内容肯定会被下一个所调的函数覆盖.

解决这个问题的几个方案:

1.返回一个指向字符串长量的指针
char *fun()
{
return "For simple strings";
}
如果需要计算字符串的内容就无能为力了!

2.使用全局声明的数组
char *fun()
{
...
my_global[i]=...;
... return my_global;
}
这适用于自创建字符的情况,缺点在于任何人都可能在任何时候修改这个全局数组.下次调用也会影响覆盖此时数组的内容.

3.使用静态数组
char *fun()
{
static char buffer[256];
... return buffer;
}
可以防止任何人修改此数组,只有拥有指向该数组的指针的函数(通过参数传递)才能修改.但是,函数下一次调用将覆盖这个数组的内容.所以调用者必须在此前使用或备份数组内容.和全局数组一样,大型缓冲区如果闲置不用是非常浪费内存的.

4.显示分配一些内存,保存返回的值
char *fun()
{
char *s=malloc(20);
... return s;
}
这个方法具有静态数组的优点,而且在每次调用时都创建一个新的缓冲区,所以该函数以后的调用不会覆盖以前的返回值.缺点在于必须承担内存管理的责任.如果内存尚在使用就free或者"内存泄露"就会有bug

5.要求调用着分配内存来保存函数的返回值,为了提高安全性,应指定缓冲区的大小(像fgets()一样)
void fun(char *result,int size)
{
...
strmcpy(result,"That be in the data",size);
}
int main(void)
{
buffer=malloc(size);
fun(buffer,size);
...
free(buffer);
...
return 0;
}
可以在统一代码块中进行malloc和free操作

  • 打赏
  • 举报
回复
是的
void mm(char** p)
{
*p="test";
}
int main(void){
char *str=0 ;
mm(&str);
printf("%s\n",str);
system("PAUSE");
return 0;
}
dfczj 2007-05-21
  • 打赏
  • 举报
回复
void mm(char *p)
{
*p ="test1\0" ;//但这样,还是没有打出test1这个字符串来.
}

int main(void){
char a[]="first\0";
char *str ;
//str=a;
mm(str);
printf("%s\n",str);
system("PAUSE");
return 0;
}
dfczj 2007-05-21
  • 打赏
  • 举报
回复
char b[]是局部变量,出了mm方法消失.p指向的内存块内容未知?是不是这样的?
  • 打赏
  • 举报
回复
错误原因 返回局部变量
Poville 2007-05-21
  • 打赏
  • 举报
回复
void mm(char **p)
{
char b[]="test1\0";//这一行[Warning] assignment makes integer from pointer without a cast
*p =b ;
}

int main(void){
char a[]="first\0";
char *str ;
str=a;
mm(&str);
printf("%s\n",str);
system("PAUSE");
return 0;
}
内容概要:本文系统研究了在不平衡电网条件下,基于延时相消算法(DSC)的T型三电平LCL并网逆变器控制策略,并通过Simulink平台完成了建模与仿真实现。研究构建了逆变器在非理想电网工况下的正负序阻抗解析模型,深入分析了同步锁相环(PLL)引发的频率耦合效应对系统稳定性的影响,提出采用序分量分离方法以提升并网性能。通过小信号扰动扫频辨识技术,从仿真数据中提取正负序阻抗特性,实现理论建模与实测数据的精确对标,并结合Nyquist稳定判据与Bode图稳定裕度指标,对系统频域稳定性进行定量评估。研究结果表明,在弱电网环境下,负序通道因相位裕度快速衰减成为系统失稳的主导因素,验证了所提控制策略在抑制宽频带振荡、提升系统鲁棒性方面的有效性与优越性。; 适合人群:从事电力电子、新能源并网、微电网控制等相关领域的科研人员及电气工程专业的研究生、高年级本科生。; 使用场景及目标:①用于分析T型三电平LCL逆变器在电网不平衡条件下的稳定机理;②指导基于序分量控制的高性能并网逆变器设计与仿真验证;③为解决弱电网下宽频带振荡问题提供理论依据和技术方案; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注第三章阻抗建模与第六章稳定性分析部分,动手复现扫频辨识过程以加深对序阻抗特性和系统失稳机理的理解。

33,315

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧