2014-03-13 139 views
0

我是新的C编程,我只是了解指针和字符串,我知道当处理指针和字符串时,我们必须为我们要使用动态内存分配声明的字符串分配内存。我想计算字符串的长度,而不使用c函数库strlen()。但为什么这下面的代码并没有给出字符串的实际长度,而是当我将*string更改为string[50]这意味着我使用数组方式来计算,代码工作正常,并给我字符串的真实长度。内存分配和动态内存分配

此代码:

#include <stdio.h> 
#include <stdlib.h> 

int len(char *string); 

int main(void){ 
char *string; 

string=(char *)malloc(len(string+1)); 

puts("enter string:"); 
fgets(string,sizeof(string),stdin); 

printf("length=%d\n",len(string)); 
return 0; 
} 

int len(char *string){ 
int len; 

while(*string!='\0'){ 
    string++; 
    len++; 
} 
return len-1; 
} 

这是当我运行代码:

enter string: 
programming 
length=2 
+0

因为你永远不会初始化'len'。编译(温和)优化和*所有*合理的警告标志(在GCC中,'-O-Wall',可能多一点)。它应该告诉你有关上面的错误。 – vonbrand

回答

3

您的代码描述了鸡和蛋的问题。要计算长度,您需要一个指针,分配空间&来分配需要计算长度的空间。

  1. string=(char *)malloc(len(string+1));

    在malloc()函数,你逝去的string这是一个还没有被初始化或分配的任何内存的指针,这意味着它包含一些垃圾值。然后当你在len()中计算它的长度时,它将取消它所包含的垃圾地址,令人惊讶的是,在这里你不会遇到段错误。

  2. 然后你有没有在你的len()函数初始化变量len,它只是增加了垃圾值len包含和回报。

我跑你的代码,它给了我一个分段错误因为上面提到的问题。