在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;isizeof(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;
}