我正在尝试使用指针而不是大小声明来定义数组,因为我不知道地图可能有多少元素。尝试链表但没有成功。如果这是一份报告,我很抱歉。我是新手请原谅,如果它看起来像一个愚蠢的问题。
#include<stdio.h>
typedef struct _keyValue
{
char *key;
char *value;
} _keyValue;
typedef struct _keyValues
{
/* _keyValue keyValue[5]; - This works*/
_keyValue *keyValue;
int size;
} _keyValues;
_keyValues map;
main()
{
map.keyValue[0].key = "Key One";
map.keyValue[0].value = "Value One";
map.keyValue[1].key = "Key Two";
map.keyValue[1].value = "Value Two";
map.size = 2;
printf("Key: %s Value: %s", map.keyValue[0].key, map.keyValue[0].value);
}
答案 0 :(得分:5)
map.keyValue
是未初始化的指针。您需要通过使用malloc
main()
{
map.keyValue = malloc(sizeof(*map.keyValue) * 2);
map.size = 2;
map.keyValue[0].key = "Key One";
map.keyValue[0].value = "Value One";
您可以稍后使用realloc
int newMapSize = ...
_keyValue* temp = realloc(map.keyValue, sizeof(*map.keyValue) * newMapSize);
if (temp == NULL) {
/* allocation failed. Handle out of memory error and exit */
}
map.keyValue = temp;
map.size = newMapSize;
// map.keyValue[0..newMapSize-1] are now available
答案 1 :(得分:2)
如果您不知道它们有多大,那么请使用动态分配。这里的主要功能是malloc和free。
如果你不知道它们有多大,这里有一个关于你如何使用你的结构的建议:
首先在您的代码中包含以下内容:
#include <stdio.h> /* for printf */
#include <string.h> /* for strcpy, as you cannot directly assign strings to a malloc'd pointer */
#include <stdlib.h> /* for malloc and free, for managing memory dynamically */
然后我们定义键和值的大小:
const int key_size = 10; /* let's define how big our keys and values will be */
const int value_size = 25;
以下是您可以使用结构的方法:
map.size = 30; /* decide how many keyValues we will have */
map.keyValue = malloc(sizeof(_keyValue) * map.size); /* create storage big enough for 30 _keyValue structs
* malloc will allow you to assign memory to key and treat it as an array
* malloc assigns memory from the heap
* equal to the size specified (30),
* this can be potentially as large as your computer's memory */
map.keyValue[0].key = malloc(sizeof(char) * key_size); /* let's create a key at position 0 */
strcpy(map.keyValue.key, "some key"); /* copying some values into key */
map.keyValue[0].value = malloc(sizeof(char) * value_size); /* let's create some space for a value for the 0th element */
strcpy(map.keyValue.value, "some value");
... /* you process and work with those values as you see fit */
free(map.keyValue[0]) /* malloc assigned memory needs to be returned to the OS as it's manually managed,
* here we free the element at position 0 we created earlier
* if you have more than element here use a loop e.g:
* for (int i = 0; i < map.size; i++) { free(map.KeyValue[i]) }
*/
free(map.keyValue); /* free the keyValue itself that stored all the keyValue structs*/
一个提示,不鼓励以下划线开头的声明,因为它们是为语言保留的。
答案 2 :(得分:1)
#include <stdlib.h>
int main(void){
map.size = 2;
map.keyValue = malloc(sizeof(_keyValue)*map.size);
map.keyValue[0].key = "Key One";
map.keyValue[0].value = "Value One";
map.keyValue[1].key = "Key Two";
map.keyValue[1].value = "Value Two";
printf("Key: %s Value: %s", map.keyValue[0].key, map.keyValue[0].value);
return 0;
}
如果我不知道尺寸
#include <stdlib.h>
#include <string.h>
int main(void){
char buff[128] = "";
map.size = 5;//decide the size temporarily
map.keyValue = malloc(sizeof(_keyValue)*map.size);
int count = 0, retv;
while(1){
printf("input key : ");
retv=scanf(" %127s", buff);
if(retv != 1 || strcmp(buff, "end")==0) break;
map.keyValue[count].key = strdup(buff);
printf("input value : ");
scanf(" %127s", buff);
map.keyValue[count].value = strdup(buff);
++count;
if(count == map.size)//full
map.keyValue = realloc(map.keyValue, sizeof(_keyValue)*(map.size+=5));//increase the size
}
int i;
for(i=0;i<count;++i)
printf("Key: %s Value: %s\n", map.keyValue[i].key, map.keyValue[i].value);
//dealloc
for(i=0;i<count;++i){
free(map.keyValue[i].key);
free(map.keyValue[i].value);
}
free(map.keyValue);
return 0;
}