Если же не известно сразу количество строк и количество символов в них то можно сделать так:
Код:
#include <stdio.h>
void main()
{
char **str;//Предположим, что строки у нас не будут превышать 256 символов
int count=0;int chars=0;
prinf("Введите количество строк: ");
scanf("%d",&count);
prinf("Введите количество символов в строке: ");
scanf("%d",&chars);
str=new char*[count];//указываем число строк
for(int i=0;i<count;i++)
{
str[i]=new char[chars];//выделяем память для каждой строки
}
for(int i=0;i<count;i++)
{
strcpy(str[i],"Hello from Varvar!");
printf("%s",str[i]);
}
delete[]str;//обязательно очистить память
}
Надеюсь это то что тебе нужно.
PS: Какие визуальные среды рулять в никсах?
http://en.wikipedia.org/wiki/ANSI_C
Я попросил написать в стандарте C. А то что ты написал этому не соотвествует никак. тоесть при компиляции куча ошибок. ИМХО ты билдер используешь. Там есть компилятор ANSI C его просто нужно выбрать и попробовать скомпилить.
Кстати лучше всего писать на ANSI C так как это обеспечивает кроссплатформенность кода
http://en.wikipedia.org/wiki/ANSI_C
Я попросил написать в стандарте C. А то что ты написал этому не соотвествует никак. тоесть при компиляции куча ошибок. ИМХО ты билдер используешь. Там есть компилятор ANSI C его просто нужно выбрать и попробовать скомпилить.
Кстати лучше всего писать на ANSI C так как это обеспечивает кроссплатформенность кода
Извени, не проверял код. Навскидку писал. Исправленный код, работающий в ANSI_C:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char **str;//Предположим, что строки у нас не будут превышать 256 символов
int count=0;int chars=0;
printf("Введите количество строк: ");
scanf("%d",&count);
printf("Введите количество символов в строке: ");
scanf("%d",&chars);
str=new char*[count];//указываем число строк
for(int i=0;i<count;i++)
{
str[i]=new char[chars];//выделяем память для каждой строки
}
for(i=0;i<count;i++)
{
strcpy(str[i],"Hello from Varvar!");
printf("%s",str[i]);
}
delete[]str;//обязательно очистить память
return 0;
}
Или это тоже не то. В каком редакторе ты пишешь. Посоветуй для линуха визуальные средства.
то что ты цикл изменил это я увидел. Меня болише интересует момент
Код:
new char[chars]
не знаю какие там у вас компиляторы ANSI C, но то что тобой написано в жизни не должно было запустится.
Что такое оператор new в C такого нет, а вот в C++ есть.
по поводу delete тоже.
насколько я знаю в C надо так:
http://ru.wikipedia.org/wiki/Malloc
Главное понял в чем хоть я ошибся
Varvar thanks.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char **str;
int count=10;//int chars=200;
str=(char **)malloc(0); // вот тут я и протупил ранее надо было указать начало строки в памяти
int i=0;
for(i=0;i<count;i++)
{
char greeting[]="Hello from Thomas!\nlong text here:\n \
Because of the functions being performed on the rows, this type of query cannot benefit from an index. \
This means that the entire table will have to be scanned to find matches to user 8. \
However, as this is a bitwise operation, it should be quite efficient in spite of the full table scan \
(I was able to perform this operation on a randomly generated table of 500,000 rows and have 250,000 \
rows returned in 1.89 seconds on my 1.6 Ghz PC).\n\n";
Thomas, мне кажеться или ты неправильно освобождаешь память
Код:
free(&str);
В free нужно передать указатель. Зачем же передавать указатель на указатель &str, помоему нужно просто предать str.
Напиши, какую среду ты использовал и компилятор.
Thomas, мне кажеться или ты неправильно освобождаешь память
Код:
free(&str);
В free нужно передать указатель. Зачем же передавать указатель на указатель &str, помоему нужно просто предать str.
Напиши, какую среду ты использовал и компилятор.
Среда - текстовый редактор mc
компилятор: gcc
OS : ASPLinux
str=(char **)malloc(0); // вот тут я и протупил ранее надо было
Нужно так:
Код:
str=(char **)malloc(count*sizeof(char*));
- Так будет правильнее, ато ты лезешь в чужой участок памяти
Это lol
Код:
sizeof(char*)
)))
размер указателя что-ли ?
malloc(0) разрешенная весчь и это нормально указывает начало памяти а потом я уже под каждую строку от того места бить начинаю
str=(char **)malloc(0); // вот тут я и протупил ранее надо было
Нужно так:
Код:
str=(char **)malloc(count*sizeof(char*));
- Так будет правильнее, ато ты лезешь в чужой участок памяти
Это lol
Код:
sizeof(char*)
)))
размер указателя что-ли ?
malloc(0) разрешенная весчь и это нормально указывает начало памяти а потом я уже под каждую строку от того места бить начинаю
По сути дела динамический двумерный массив - это одномерный динамический массив, который указывает на др. динамические массивы, а следовательно тоже имеет размер: количество елементов на размер типа указатель.
Кинь мне ссылку где говориться что можно использовать malloc(0).
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах