2010-08-27 3 views
1

Это мой код:Почему я получаю ошибку «размер хранилища неизвестен» в этой программе?

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

#include <curl/curl.h> 
#include <curl/types.h> 
#include <curl/easy.h> 
char test[]; 
size_t write_data(char *ptr, size_t size, size_t nmemb, FILE *stream) 
{ 
    char buf[size*nmemb+1]; 
    char * pbuf = &buf[0]; 
    memset(buf, '\0', size*nmemb+1); 
    size_t i = 0; 
    for(; i < nmemb ; i++){ 
    strncpy(pbuf,ptr,size); 
    pbuf += size; 
    ptr += size; 
    } 

    printf("%s",buf); 
    test=new test[size*nmemb+1]; 
    return size * nmemb; 
} 

int main() 
{ 
    CURL *curl_handle; 
    curl_handle = curl_easy_init(); 

    curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.google.com"); 
    curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS ,1); 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION,&write_data); 
    curl_easy_perform(curl_handle); 
    curl_easy_cleanup(curl_handle); 
    return 0; 
} 

Почему я получаю эту ошибку:

../src/get_webpage.cpp:9: error: storage size of ‘test’ isn't known 
../src/get_webpage.cpp: In function ‘size_t write_data(char*, size_t, size_t, FILE*)’: 
../src/get_webpage.cpp:23: error: expected type-specifier before ‘test’ 
../src/get_webpage.cpp:23: error: expected ‘;’ before ‘test’ 
+0

Неправильный вопрос: речь идет не о динамическом распределении памяти – pmod

+0

1. Это не C код, как ваши предполагает, что это больше похоже на C++. 2. Использование глобальных переменных считается плохой практикой. –

+0

Кроме того, если вы действительно хотите, чтобы ваша программа была C, а не C++, переименуйте ее так, чтобы она имела только .c в качестве расширения. Здесь ваш компилятор принимает это как C++. –

ответ

2

Изменение char test[]; в char *test;

+0

это работает .... как я могу получить доступ к тестовому значению в основной функции, если я верну тест, он говорит об ошибке ??? – lal

+0

#Ial test является глобальным, и вы можете получить к нему доступ, как и с любой локальной переменной. Но уловка - это обратный вызов, который нужно удалить, чтобы тест содержал данные. Это может потребовать дополнительного кода для добавления. –

1

тест = новый тест [размер * nmemb + 1];

Это код C++, а не С. Изменить его

test = malloc(size*nmemb+1); 

Также рекомендуется, чтобы освободить его где-нибудь. Возможно, в конце основного или перед его распределением.

free(test); 

Удачи.

0
char buf[size*nmemb+1]; 

Является C99 не C89. Для больше nmemb ->stackoverflow, лучше здесь также использовать дин. Распределение

char *buf = calloc(1,size*nmemb+1), *pbuf = buf; 
size_t i = 0; 
if(!buf) 
    { error-handling needed } 
... 
free(buf); 
Смежные вопросы