内存分配和动态内存分配

时间:2014-03-13 19:33:19

标签: c arrays string pointers

我是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

1 个答案:

答案 0 :(得分:3)

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

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

    在malloc()中,您传递的是string,它是一个尚未初始化或分配任何内存的指针,这意味着它包含一些垃圾值。然后当你在len()中计算它的长度时,它会取消引用它包含的垃圾地址,令人惊讶的是你不会在这里得到一个段错误。

  2. 然后您尚未在len函数中初始化len()变量,它只会添加len包含并返回的垃圾值。

  3. 由于上述问题,我运行了您的代码并且它给了我分段错误