c - string是数组还是指针?

标签 c arrays string printf

我在这里得到了这个小程序,它带有预先分配的“count”数字,然后将其解析为“xxx”的格式,其中x是0或相应的密码(例如,从“6”我得到006,从234 我得到 234)。当我得到这样的结果时

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

int main(int argc, char* argv[])
{
    int count = 0;

    char number[2] = {0};

    int base0 = count % 10;
    int base1 = ((count % 100) - base0) / 10;
    int base2 = ((count % 1000) - base1) / 100;
    sprintf(number, "%d%d%d", base2, base1, base0); //print into the number variable
    printf("%s\n", number); 
}

一切工作正常,但如果我用

切换“数字”变量定义
char* number = NULL;

我遇到段错误。这是为什么?它应该只指向字符串的开头。

最佳答案

在 C 语言中,字符串表示为字符数组;该行

char number[2] = { 0 };

因此定义了一个用两个空字符初始化的两个字符数组(“字符串”)。

数组是一系列连续(读作“彼此相邻”)的内存块,每个内存块都可以通过下标运算符(方括号)单独访问。

当您将上面的行更改为

char* number = NULL;

您不再定义字符数组。在本例中,您现在正在定义一个指向 char 变量的指针。因为数组基本上是彼此相邻的内存块,所以如果您知道第一个元素在哪里,就可以找到任何其他元素。因此,由于引用运算符允许您访问指针指向的值,因此您可以使用

访问字符串中的第 i 个元素
*(char + i)

在 C 语言中完全等同于

char[i]

现在,在您的情况下,您尚未将 char* 设置为指向包含真实字符串的实际内存,您已分配了 NULL 指针,这意味着“此指针无处指向”。将 char* 视为字符串需要取消引用(跟随指针);但是,取消引用 NULL 指针是一种未定义的行为,在这种情况下会导致段错误

关于c - string是数组还是指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39780826/

相关文章:

c - 这是在 C 中创建数组的有效方法吗?

c++ - 将 LPWSTR 转换为 char*/string

java - 识别字符串数组中的文本

c - 为什么在 glibc 引用中测试 int 的符号被称为 "sloppy code"?

java - 数组 <?在 Java 中扩展 T>

arrays - Ruby 合并排序——这个递归函数是如何工作的?

c# - 递归获取字符串的形式

c - 使用 FastCGI 和 NGINX 运行 C 代码

iphone - iPhone 的 C 编译器?

c - 访问和存储结构元素