开门见山,直接上代码!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory( char* p ){
p = ( char* ) malloc ( 100 );
}
void CalcBlank( void ){
char *str = NULL;
char *ptr = NULL;
unsigned int i = 0;
GetMemory( ( char * ) str );
strcpy( str, " change the iworld by everyone\n ");
ptr = str;
while( '\0' != *ptr){
if( *ptr == ' ')
{
i++;
}
ptr++;
}
printf("the blank number is %d \n", i );
free(ptr);
}
int main( void ){
CalcBlank();
return 0;
}
在liunx环境中运行,命令如下:
gcc -o blank blank.c -g
结果如下:
结果提示:段错误。结果与我们预期的不一样,使用gdb调试
通过分析可能是指针str内存分配的问题。
最后发现CalcBlank( )函数中的指针str要的到的是内存分配的首地址,而传递的是一个内存的指针。修改代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory( char** p ){
*p = ( char* ) malloc ( 100 );
}
void CalcBlank( void ){
char *str = NULL;
char *ptr = NULL;
unsigned int i = 0;
GetMemory( ( char** ) &str );
strcpy( str, " change the iworld by everyone\n ");
ptr = str;
while( '\0' != *ptr){
if( *ptr == ' ')
{
i++;
}
ptr++;
}
printf("the blank number is %d \n", i );
free(ptr);
}
int main( void ){
CalcBlank();
return 0;
}
修改结果如下:
可以看到空格数已经显示出来,但是还有段错误,继续使用gdb调试,运行到错误处。
发现是free(ptr),指针ptr和str指向同一个地址,因此发生错误。
最后修改代码,结果显示如下: