【问题标题】:memory allocation and dynamic memory allocation内存分配和动态内存分配
【发布时间】:2014-03-13 19:33:19
【问题描述】:

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

【问题讨论】:

  • 因为你从不初始化len。使用(轻度)优化和 all 合理的警告标志(在 GCC 中,-O -Wall,可能更多)进行编译。它应该告诉你上面的错误。

标签: c arrays string pointers


【解决方案1】:

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

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

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

  2. 然后你还没有在你的len()函数中初始化len变量,它只是添加到len包含并返回的垃圾值。

我运行了您的代码,但由于上述问题,它给了我一个分段错误

【讨论】:

    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2013-07-01
    相关资源
    最近更新 更多