c - 内存分配和动态内存分配

标签 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. string=(char *)malloc(len(string+1));

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

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

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

关于c - 内存分配和动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22389062/

相关文章:

python - 在 Numpy 下对两个矩阵中的所有成对行应用一个函数

Java CombSort 陷入无限循环?

java - 为什么这两个代码没有给出相同的输出?

c# - 用不同的标记拆分字符串

javascript - 如何使用 JS Regex 从 google 查询链接获取查询值? (Chrome 扩展)

C中的常量指针

c - OpenCV (C,2.0) 输入点因内部函数变量转换而困惑

c - 如何使用 while 循环扫描数字和运算符系列?

c - 将指针数组分配给字符串

Java - 如何将列表位置拉为整数?