Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中存储char*数组_C_Arrays_Sizeof - Fatal编程技术网

在C中存储char*数组

在C中存储char*数组,c,arrays,sizeof,C,Arrays,Sizeof,我正在尝试创建并存储一个char*数组 所以,首先我尝试了这个: int main() { char* values[3]; values[0] = "Hello"; values[1] = "Mew meww"; values[2] = "Miau miau =3"; for(int i=0; i<sizeof(values); i++) printf("%s", values[i]); } intmain(){ 字符*值[3]

我正在尝试创建并存储一个
char*
数组

所以,首先我尝试了这个:

int main() {
    char* values[3];
    values[0] = "Hello";
    values[1] = "Mew meww";
    values[2] = "Miau miau =3";

    for(int i=0; i<sizeof(values); i++)
        printf("%s", values[i]);
}
intmain(){
字符*值[3];
值[0]=“你好”;
值[1]=“Mew meww”;
数值[2]=“Miau-Miau=3”;
对于(inti=0;i一个问题是

scanf("%32s", &dic[i]);
应该是哪一个

scanf("%32s", dic[i]);
因为数组包含指向存储的指针,而不是存储本身,您应该传递给
scanf
的就是这个指针。实际上,
char*
只是一个4字节的指针。数组
char*dic[tam]
包含一些这样的指针,因此
dic[0]
是指向
char
&dic[0]的4字节指针
是此指针的地址。然后

scanf("%32s", &dic[i]);
只会覆盖此指针,并在它之后损坏内存

另一个问题是您没有初始化阵列,因此它不指向任何存储

char* dic[tam];
这里,数组包含指向内存中随机位置的指针

scanf("%32s", &dic[i]);
很可能这根本就失败了。因此,在
printf
中,您可以打印指向内存中随机位置的指针

scanf("%32s", &dic[i]);
一个(糟糕的)解决方案是:

for(int i=0; i<tam; i++)
{
    printf("Palabra %d: ",(i+1));

    dic[i] = new char [1000]; // here you assign it some storage

    scanf("%32s", dic[i]); // NOT &dic[i]
}

用于(int i=0;i对于这两个示例,需要理解的关键是
char*
值在内存中存储字节的地址。按照惯例,C字符串表示为指向字符串第一个字节的指针,空字节表示结束。当您将常量字符串赋给数组时,编译器会分配NECE释放内存并将指针放入数组中,但当您不使用常量时,您有责任分配缓冲区来存储字符串,然后自己将该指针存储在数组中

在第二个示例中,您为指向
char
的几个指针分配了存储空间,但您没有使这些指针引用有效的缓冲区,因此访问它们时要么返回垃圾,要么使程序崩溃。至少有有两种方法可以解决这个问题:要么在堆栈上分配一个固定大小的缓冲区并将数据存储在那里,要么使用
malloc
从堆中动态分配内存

前者的优点是自动处理缓冲区的释放,但需要您在编译时决定为每个字符串分配多少内存:

char* dic[tam];
char buf[tam * 32]; // allocate 32 bytes per element.
for (int i = 0; i < tam; i++) {
    // Make the pointers in ``dic`` refer to 32-byte offsets into the buffer.
    dic[tam] = &(buf[tam * 32]);
}
但由于这使用了
malloc
,因此您需要确保在返回之前清理此内存,以避免内存泄漏。例如,在例行程序结束时:

for (int i = 0; i < tam; i++) {
    // de-allocate the buffer we allocated earlier
    free(dic[tam]);
}
for(int i=0;i
(这种在循环中多次调用
malloc
的方法也可能会导致内存碎片,如果您经常这样做,但这是一个高级主题,对于一个小程序来说不值得担心。)

\include
#包括
int main(){
字符*值[3];
值[0]=“你好”;
值[1]=“Mew meww”;
数值[2]=“Miau-Miau=3”;

for(int i=0;i
sizeof(values)
-->
sizeof(values)/sizeof(*values)
values是一个由三个指针组成的数组。sizeof(values)是值占用的字节数。由于它是一个由三个指针组成的数组,假设指针是四个字节,sizeof(values)=3*4=12字节。对于第二个问题,您需要为用户字符串(即,不仅仅是一个初始化指针数组)分配存储空间。没有为
dic
的元素保留空间,您正在写入任意内存地址。@sharth问题是,您中几乎没有人知道如何读取。我从未要求sizeof().我刚才提到了“不知道为什么会发生这种情况”。如果你是一个有准备的人,读了完整的问题和标题,就会明白。但只有两个来自各地的人答对了。回答中的BLUE和Alexander甚至没有提到sizeof,因为他们知道我在问什么。你们都得到了“简单”这样回答了问题的前半部分…我知道,我明白了。我在另一个问题中读到了它,但我想知道为什么我不能在内存中分配数组。如果我像dic[0]那样存储它我的程序崩溃了。我发现这个问题现在只是我最初回答的第一部分。如果另一部分被分成第二个问题,我希望能有一个链接,这样我就可以把我答案的第二部分移到那里。我从来没有问过答案的大小。我只是提到“我不知道为什么”.但从来没有问过。你应该是工程师。你必须学习所有问题的完整性和具体性!从所有的aprox中。10个评论和回答的人都弄错了。只是BLUE ans Alexander学会了阅读。我不得不编辑我的问题,因为有人编辑了询问的大小,而我的主要问题甚至不是。从来没有问过sizeof。我要求存储一个数组。这甚至是我的标题。很好。我删除了我答案的第一部分,这样它现在就回答了新形式的问题,而不是讨论
大小的问题。(尽管您问题中的示例中仍然存在错误。)当我尝试在没有&memory引用的情况下存储时,我的程序崩溃:(是的,但是蓝色的答案最适合我的问题:PI在MaloC D中得到这个例外:!“无效的从空到Char的转换”谢谢你的帮助:“ZoDITU会因为使用C++编译器而不是C编译器。改为<代码> DIC[i] =(char)Maloc(33);< /代码>裤子谢谢,我非常想你:D!
char* dic[tam];
for (int i = 0; i < tam; i++) {
    // Allocate 32 bytes per element.
    // (This value can be decided at runtime, if you want.)
    dic[tam] = malloc(32);
}
for (int i = 0; i < tam; i++) {
    // de-allocate the buffer we allocated earlier
    free(dic[tam]);
}
#include <stdio.h>
#include <stdlib.h>

int main(){
    char* values[3];
    values[0] = "Hello";
    values[1] = "Mew meww";
    values[2] = "Miau miau =3";

    for(int i=0; i<sizeof(values)/sizeof(*values); i++)
        printf("%s\n", values[i]);

    printf("%s", "Size for dictionary: ");
    int tam;
    scanf("%i", &tam);
    char *dic[tam];

    for(int i=0; i<tam; i++){
        printf("Palabra %d: ",(i+1));
        dic[i] = malloc(33);
        scanf("%32s", dic[i]);
    }
    for(int i=0; i<tam; i++){
        printf("%s\n", dic[i]);
        free(dic[i]);
    }

    return 0;
}