我正在用C寫一個nginx模塊,並且有一些超級怪異的結果。我從我的模塊中提取了一個函數來測試它的輸出以及相關的nginx類型/宏定義。printf()似乎在破壞我的數據
我在我的build_key_hash_pair
函數中構建一個結構,然後在main
的內容上做一個printf()
。當我在printf
內部函數中的數據時,main
的輸出有效。當我在內部函數中刪除printf
時,main
會打印一個空字符串。這很讓人困惑,因爲在函數調用build_key_hash_pair
之後,除了顯示數據外,我沒有對數據進行操作。下面是代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct ngx_str_t {
size_t len;
char *data;
} ngx_str_t;
typedef uintptr_t ngx_uint_t;
typedef struct key_hash_pair {
ngx_uint_t hash;
ngx_str_t key;
} key_hash_pair;
#define ngx_string(str) { sizeof(str) - 1, (char *) str }
#define ngx_str_set(str, text) \
(str)->len = sizeof(text) - 1; (str)->data = (char *) text
#define ngx_hash(key, c) ((ngx_uint_t) key * 31 + c)
#define ngx_str_null(str) (str)->len = 0; (str)->data = NULL
void build_key_hash_pair(key_hash_pair *h, ngx_str_t api_key, ngx_str_t ip);
int main (int argc, char const *argv[])
{
ngx_str_t api_key = ngx_string("86f7e437faa5a7fce15d1ddcb9eaeaea377667b8");
ngx_str_t ip = ngx_string("123.123.123.123");
key_hash_pair *pair;
pair = malloc(sizeof(key_hash_pair));
build_key_hash_pair(pair, api_key, ip);
printf("api_key = %s\n", api_key.data);
printf("ip = %s\n", ip.data);
printf("pair->key = %s\n", pair->key.data);
printf("pair->hash = %u\n", (unsigned int)pair->hash);
return 0;
}
void build_key_hash_pair(key_hash_pair *h, ngx_str_t api_key, ngx_str_t ip)
{
ngx_str_null(&h->key);
char str[56];
memset(str, 0, sizeof(str));
strcat(str, api_key.data);
strcat(str, ip.data);
ngx_str_set(&h->key, str);
ngx_uint_t i;
for (i = 0; i < 56; i++) {
h->hash = ngx_hash(&h->hash, h->key.data[i]);
}
}
這裏是輸出當我做了printf("hello")
的build_key_hash_pair
函數內部:
helloapi_key = 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
ip = 123.123.123.123
pair->key = 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8123.123.123.123
pair->hash = 32509824
這裏是(奇怪的)輸出,當我不printf
內build_key_hash_pair
:
api_key = 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
ip = 123.123.123.123
pair->key =
pair->hash = 32509824
如您所見,pair->key
沒有數據。在gdb中,如果我在build_key_hash_pair
的main調用後立即斷點,pair->key
包含適當的數據。但是在第一次撥打printf
後,它被刪除。內存地址保持不變,但數據剛剛消失。任何人都可以告訴我,我做錯了什麼?
也許我錯過了一些東西,但是你的空終止符在哪裏? – KevinDTimm
字符串常量在末尾不需要顯式空字節。這些是由編譯器添加的。 –