怎么消除这个警告?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?



...全文
8224 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;
}
内容概要:本文针对高渗透率分布式光伏与储能变流器接入配电网所带来的运行挑战,深入研究了传统跟网型(GFL)逆变器在电网故障、弱电网及孤岛工况下易失稳脱网,以及构网型(GFM)虚拟同步发电机(VSG)逆变器在并网状态下缺乏同步调节能力的技术瓶颈,提出了一种可实现GFL与GFM双向平滑切换的先进控制策略。研究首先构建了GFL与GFM共用的硬件平台与内环控制基础,继而系统性地设计了基于关键电气量实时监测的切换判据、精确的双向切换时序逻辑,并创新性地引入了过渡过程的平滑抑制策略,以有效抑制切换瞬间的有功功率冲击、电压闪变与频率突变。全文在Matlab/Simulink环境中搭建了完整的仿真模型,通过对并网转孤岛、孤岛转并网等多种工况的动态仿真,全面验证了所提策略的有效性,结果表明该方法能确保系统在模式切换过程中电压、电流与频率的平稳过渡,显著提升了微电网在复杂运行条件下的韧性、稳定性与供电可靠性。; 适合人群:从事电力电子、新能源并网、微电网控制、智能配电网等领域的高校研究生、科研院所研究人员及电力系统相关企业的工程技术人员。; 使用场景及目标:① 解决高比例可再生能源接入引发的电网稳定性与电能质量问题;② 实现微电网在并网与孤岛两种运行模式间的无缝、可靠切换,保障重要负荷的不间断供电;③ 为构网型与跟网型逆变器的协同运行、新型电力系统构建提供先进的控制理论依据与可落地的技术解决方案。; 阅读建议:建议结合文中提供的Simulink仿真模型进行深入学习,重点剖析切换逻辑模块的设计原理与参数整定方法,通过反复观察和分析不同工况下的仿真波形,深刻理解平滑切换过程中的动态响应机理与控制思想。
内容概要:本文提出了一种基于粒子群算法(PSO)优化模糊C均值(FCM)聚类的居民用电行为分析方法,旨在解决传统FCM算法对初始聚类中心敏感、易陷入局部最优解的问题。通过引入PSO算法全局寻优能力,优化FCM的初始聚类中心选择,显著提升了聚类结果的准确性与稳定性。研究结合Matlab平台实现了算法仿真与实证分析,有效挖掘出居民用电负荷的典型模式,为电力系统的需求侧管理、精细化负荷预测及个性化用电服务提供了可靠的数据分析基础和技术支撑。; 适合人群:具备一定电力系统基础知识与Matlab编程能力,从事电力大数据分析、智能电网、负荷特性研究、需求响应等相关领域的科研人员、高校研究生及工程技术开发者。; 使用场景及目标:①应用于居民用电数据的聚类分析,识别不同用户的典型用电模式与行为特征;②优化传统FCM算法性能,提升聚类过程的鲁棒性与收敛效率;③为电力公司制定差异化电价策略、实施精准需求响应措施以及开展用户画像构建提供科学依据。; 阅读建议:读者应结合Matlab代码实现部分,深入理解PSO优化FCM的整体流程,重点关注适应度函数的设计原则、PSO关键参数(如惯性权重、学习因子)的设定及其对聚类效果的影响,并建议使用真实的居民用电数据集进行实验验证与参数调优,以充分掌握该方法的实际应用技巧。

33,315

社区成员

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

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