realloc错在哪里

陈思有 2011-09-20 10:08:38
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int StrInsert( char *str, int n, char *str_ins );
void DestroyStr( char *str, char *str_ins);

void main()
{
char *str,*str_ins;
int n,i;
str = malloc( 20*sizeof(char) );
gets( str );
str_ins = malloc( 10*sizeof(char) );
gets( str_ins );
scanf("%d",&n);

i = StrInsert( str, n, str_ins );

if ( i == 0 )
{
printf("wrong\n");
}

else
{
printf("%s\n",str);
}

DestroyStr( str, str_ins );
}

int StrInsert( char *str, int n, char *str_ins )
{
int i,j,str_len,str_ins_len;

str_len = strlen( str );
str_ins_len = strlen( str_ins );
//n不能小于1或大于被插入的字符串的长度
if ( n<1 || n>str_len )
{
return 0;
}
else
{ //重新为str_ins分配内存,将str字符串从n开始的字符串接到它后面
str_ins = realloc(str_ins,(str_len-n+1+str_ins_len+100)*sizeof(char));
if ( str_ins==NULL )
{
exit( 0 );
}
for ( i=n-1,j=0; *(str+i); i++,j++ )
{
*(str_ins+str_ins_len+j) = *(str+i);
}
*(str_ins+str_ins_len+j) = '\0';

str = realloc(str,(str_len+str_ins_len+100)*sizeof(char));
if( str == NULL )
{
exit( 0 );
}

for ( j=0; *str_ins; j++ )
{
*(str+n-1+j) = *str_ins++;
}
*(str+n-1+j) = 0;

return 1;
}
}

void DestroyStr( char *str, char *str_ins )
{
free( str );
free( str_ins );
}


如果把那两句realloc拿起来就可以
...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈思有 2011-09-21
  • 打赏
  • 举报
回复
为什么会这样呢
hkping420 2011-09-21
  • 打赏
  • 举报
回复

#include<iostream>
#include <string>
using namespace std;

int StrInsert( char *str, int n, char *str_ins );
void DestroyStr( char *str, char *str_ins);

void main()
{
char *str,*str_ins;
int n,i;
str = (char*)malloc( 20*sizeof(char) );
cin.getline(str ,sizeof(str));
str_ins = (char*)malloc( 10*sizeof(char) ); cin.getline(str_ins ,sizeof(str_ins));
cin>>n;//scanf("%d",&n);
i = StrInsert( str, n, str_ins );

if ( i == 0 )
{
printf("wrong\n");
}

else
{
printf("%s\n",str);
}

DestroyStr( str, str_ins );
}

int StrInsert( char *str, int n, char *str_ins )
{
int i,j,str_len,str_ins_len;

str_len = strlen( str );
str_ins_len = strlen( str_ins );
//n不能小于1或大于被插入的字符串的长度
if ( n<1 || n>str_len )
{
return 0;
}
else
{ //重新为str_ins分配内存,将str字符串从n开始的字符串接到它后面
str_ins =(char*)realloc(str_ins,(str_len-n+1+str_ins_len+100)*sizeof(char));
if ( str_ins==NULL )
{
exit( 0 );
}
for ( i=n-1,j=0; *(str+i); i++,j++ )
{
*(str_ins+str_ins_len+j) = *(str+i);
}
*(str_ins+str_ins_len+j) = '\0';

str = (char*)realloc(str,(str_len+str_ins_len+100)*sizeof(char)); if( str == NULL )
{
exit( 0 );
}

for ( j=0; *str_ins; j++ )
{
*(str+n-1+j) = *str_ins++;
}
*(str+n-1+j) = 0;

return 1;
}
}

void DestroyStr( char *str, char *str_ins )
{
free( str );
free( str_ins );
}




modicum_lf 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 csiyou 的回复:]
我以前看C和指针的时候,里面好像有写不必强制转换。但是,我这里为什么出错呢
[/Quote]
在C语言里有自动转换!可以不加 !
但是C++语言中就必须加上!

陈思有 2011-09-20
  • 打赏
  • 举报
回复
我以前看C和指针的时候,里面好像有写不必强制转换。但是,我这里为什么出错呢
modicum_lf 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 csiyou 的回复:]
加了(char * )可以了,但是不是说malloc这些分配内存是返回的类型是void *吗,它会自动转换成char *吗
[/Quote]
C 语言可以不加,C++ 直接挂掉 !

还有你在主函数分配的20 和 10 字节的长度可能足够你操作短小的字符串插入了!
并且没必要写这么复杂 就算要realloc 也只要str realloc()就行 !
你这程序略写复杂 !

「已注销」 2011-09-20
  • 打赏
  • 举报
回复
这里就是需要强制转换的.
AnYidan 2011-09-20
  • 打赏
  • 举报
回复
编译通过了吗?

malloc, realloc, calloc 的返回值类型是 void*, 需要强制转换
Jake443403168 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 csiyou 的回复:]
加了(char * )可以了,但是不是说malloc这些分配内存是返回的类型是void *吗,它会自动转换成char *吗
[/Quote]
在C里面可以,C++里面是不行的
陈思有 2011-09-20
  • 打赏
  • 举报
回复
加了(char * )可以了,但是不是说malloc这些分配内存是返回的类型是void *吗,它会自动转换成char *吗
Jake443403168 2011-09-20
  • 打赏
  • 举报
回复
在mallo和realloc前面加个(char*)强转一下再试试把
陈思有 2011-09-20
  • 打赏
  • 举报
回复
有人吗
简介: C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了数十年,仍然是最流行的编程语言之一。C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量的C程序代码。 全书一共11章:第1章重点阐述了C语言中不易被理解的多个核心概念,很多初学者在理解这些概念时都会存在误区;第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解误用的陷阱知识点进行了剖析;第11章则对所有程序员必须掌握的几种算法进行了详细的讲解;附录经验性地总结了如何养成良好的编码习惯,这对所有开发者都尤为重要。 本书主要内容:  堆和栈、全局变量和局部变量、生存期和作用域、内部函数和外部函数、指针变量、指针数组和数组指针、指针函数和函数指针、传址和传值、递归和嵌套、结构体和共用体、枚举、位域等较难理解的核心概念的阐述和对比;  预处理中的疑难知识点,包括文件的包含方式、宏定义及其常见误解析、条件编译指令和#pragma指令的使用等;  if、switch等选择结构语句的使用注意事项和易点解析;  for、while、do while等循环结构语句的使用注意事项和易点解析;  循环结构中break、continue、goto、return、exit的区别;  一维数组、二维数组、多维数组、字符数组、动态数组的定义和引用,以及操作数组时的各种常见误解析;  不同类型的指针之间的区别,以及指针的一般用法和注意事项;  指针与地址、数组、字符串、函数之间的关系,以及指针与指针之间的关系;  枚举类型的使用及注意事项,结构体变量和共用体变量的初始化方法及引用;  传统链表的实现方法和注意事项,以及对传统链表实现方法的颠覆;  与函数参数、变参函数、函数调用、函数指针相关的一些难理解和容易被理解的知识点解析;  文件和指针的使用原则、技巧和注意事项;  函数调用和异常处理的注意事项和最佳实践;  与strlen、sizeof、const、volatile、void、void*、#define、typedef、realloc、malloc、calloc等相关的一些陷阱知识点的解析;  时间复杂度、冒泡排序法、选择排序法、快速排序法、归并排序法、顺序排序法、二分查找等常用算法的详细讲解;  良好的编码习惯和编程风格。
C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了数十年,仍然是最流行的编程语言之一。C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量的C程序代码。 全书一共11章:第1章重点阐述了C语言中不易被理解的多个核心概念,很多初学者在理解这些概念时都会存在误区;第2~8章对预处理、选择结构和循环结构的程序设计、数组、指针、数据结构、函数和文件等知识点的核心问题和注意事项进行了讲解;第9章介绍了调试和异常处理的方法及注意事项;第10章对C语言中的若干容易让开发者误解误用的陷阱知识点进行了剖析;第11章则对所有程序员必须掌握的几种算法进行了详细的讲解;附录经验性地总结了如何养成良好的编码习惯,这对所有开发者都尤为重要。 本书主要内容:  堆和栈、全局变量和局部变量、生存期和作用域、内部函数和外部函数、指针变量、指针数组和数组指针、指针函数和函数指针、传址和传值、递归和嵌套、结构体和共用体、枚举、位域等较难理解的核心概念的阐述和对比;  预处理中的疑难知识点,包括文件的包含方式、宏定义及其常见误解析、条件编译指令和#pragma指令的使用等;  if、switch等选择结构语句的使用注意事项和易点解析;  for、while、do while等循环结构语句的使用注意事项和易点解析;  循环结构中break、continue、goto、return、exit的区别;  一维数组、二维数组、多维数组、字符数组、动态数组的定义和引用,以及操作数组时的各种常见误解析;  不同类型的指针之间的区别,以及指针的一般用法和注意事项;  指针与地址、数组、字符串、函数之间的关系,以及指针与指针之间的关系;  枚举类型的使用及注意事项,结构体变量和共用体变量的初始化方法及引用;  传统链表的实现方法和注意事项,以及对传统链表实现方法的颠覆;  与函数参数、变参函数、函数调用、函数指针相关的一些难理解和容易被理解的知识点解析;  文件和指针的使用原则、技巧和注意事项;  函数调用和异常处理的注意事项和最佳实践;  与strlen、sizeof、const、volatile、void、void*、#define、typedef、realloc、malloc、calloc等相关的一些陷阱知识点的解析;  时间复杂度、冒泡排序法、选择排序法、快速排序法、归并排序法、顺序排序法、二分查找等常用算法的详细讲解;  良好的编码习惯和编程风格。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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