Ошибка Invalid pointer при использовании malloc и struct - C (СИ)

  1. Здравствуйте. Написал программу для того, чтобы понять работу malloc.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <stdio.h> #include <stdlib.h>   typedef struct {     char* first_name;     char* last_name; } Entry;   int main(void) {     Entry *e;     e = malloc(1*sizeof(Entry));     (*e).first_name=malloc(10*sizeof(char));     (*e).first_name="Dmitry";       (*e).last_name=malloc(10*sizeof(char));     (*e).last_name="Sidorov";       printf("%s %s\n", (*e).first_name, (*e).last_name);     free((*e).first_name);     free((*e).last_name);     free(e);     return EXIT_SUCCESS; }При выполнении программы возникает ошибка:Bash1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ./test Dmitry Sidorov *** Error in `./test': munmap_chunk(): invalid pointer: 0x0000000000400714 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x7f4c6)[0x7fd9aaff44c6] ./rodion[0x400643] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fd9aaf96de5] ./rodion[0x4004f9] ======= Memory map: ======== 00400000-00401000 r-xp 00000000 08:01 2752626                            /home/dmitry/Desktop/c/test 00600000-00601000 r--p 00000000 08:01 2752626                            /home/dmitry/Desktop/c/test 00601000-00602000 rw-p 00001000 08:01 2752626                            /home/dmitry/Desktop/c/test 014b9000-014da000 rw-p 00000000 00:00 0                                  [heap] 7fd9aad5f000-7fd9aad74000 r-xp 00000000 08:01 1577226                    /lib/x86_64-linux-gnu/libgcc_s.so.1 7fd9aad74000-7fd9aaf73000 ---p 00015000 08:01 1577226                    /lib/x86_64-linux-gnu/libgcc_s.so.1 7fd9aaf73000-7fd9aaf74000 r--p 00014000 08:01 1577226                    /lib/x86_64-linux-gnu/libgcc_s.so.1 7fd9aaf74000-7fd9aaf75000 rw-p 00015000 08:01 1577226                    /lib/x86_64-linux-gnu/libgcc_s.so.1 7fd9aaf75000-7fd9ab132000 r-xp 00000000 08:01 1576723                    /lib/x86_64-linux-gnu/libc-2.17.so 7fd9ab132000-7fd9ab332000 ---p 001bd000 08:01 1576723                    /lib/x86_64-linux-gnu/libc-2.17.so 7fd9ab332000-7fd9ab336000 r--p 001bd000 08:01 1576723                    /lib/x86_64-linux-gnu/libc-2.17.so 7fd9ab336000-7fd9ab338000 rw-p 001c1000 08:01 1576723                    /lib/x86_64-linux-gnu/libc-2.17.so 7fd9ab338000-7fd9ab33d000 rw-p 00000000 00:00 0 7fd9ab33d000-7fd9ab360000 r-xp 00000000 08:01 1576697                    /lib/x86_64-linux-gnu/ld-2.17.so 7fd9ab541000-7fd9ab544000 rw-p 00000000 00:00 0 7fd9ab55b000-7fd9ab55f000 rw-p 00000000 00:00 0 7fd9ab55f000-7fd9ab560000 r--p 00022000 08:01 1576697                    /lib/x86_64-linux-gnu/ld-2.17.so 7fd9ab560000-7fd9ab562000 rw-p 00023000 08:01 1576697                    /lib/x86_64-linux-gnu/ld-2.17.so 7fff751ee000-7fff7520f000 rw-p 00000000 00:00 0                          [stack] 7fff75361000-7fff75363000 r-xp 00000000 00:00 0                          [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall] AbortedИ еще есть утечка памяти:Bash1 2 3 4 5 6 7 8 valgrind -v --tool=memcheck --leak-check=yes ./test   ==13378== LEAK SUMMARY: ==13378==    definitely lost: 13 bytes in 2 blocks ==13378==    indirectly lost: 0 bytes in 0 blocks ==13378==      possibly lost: 0 bytes in 0 blocks ==13378==    still reachable: 0 bytes in 0 blocks ==13378==         suppressed: 0 bytes in 0 blocks


textual

Код к задаче: «Ошибка Invalid pointer при использовании malloc и struct - C (СИ)»

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct
{
    char* first_name;
    char* last_name;
} Entry;
 
int main(void)
{
    Entry *e;
    e = malloc(sizeof(Entry));
    e->first_name = malloc (10 * sizeof(char));
    memmove (e->first_name, "Dmitry", 7);
 
    e->last_name = malloc (10 * sizeof(char));
    memmove (e->last_name, "Sidorov", 8);
 
    printf("%s %s\n", e->first_name, e->last_name);
    free(e->first_name);
    free(e->last_name);
    free(e);
    return EXIT_SUCCESS;
}

СДЕЛАЙТЕ РЕПОСТ

6   голосов, оценка 3.667 из 5



Похожие ответы
  1. В строке с условием if ( B[i][j]%2==0) выдает ошибку, подскажите, пожалуйста. как исправить.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #include #include   int main() {   float A[6], A1[6], B[3][6];   float Sum1B; int i, j, k, param;   param=5;   k=6   // Ввод значений элементов массива A  ;printf ("Vvod A[6]:\n"); for (i=0; i<6; i++ )  scanf ("%f",&A[i]); // Вывод значений элементов массива A printf ("\n\nMassiv A:\n"); for (i=0; i<5; i++ )  printf ("%5.2f ", A[i]) // Вычисление и вывод значений элементов массива B ;printf ("\n\nMassiv B:\n"); for (i=0; i<3; i++)  {   for (j=0; j<6; j++)    {      B[i][j]=i+A[j]+log10(param);      printf ("%5.2f ", B[i][j]);    }  printf ("\n");  } // Вычисление и вывод суммы четных элементов первой строки массива B Sum1B=0;  for (j=0; j<6; j++)   if ( B[i][j]%2==0)   Sum1B+=B[i][j];   printf ("\nSum1B=%5.2f\n", Sum1B); // Вычисление значений массива А1 по условию  if (Sum1B>11)  {   // Постановка элемнтов массива А в А1 в обратном порядке   for (i=0; i<6; i++) A1[i]=A[k-i];  }  else   for (j=0; j<6; j++) A1[i]=B[3][j];   // Вывод значений элементов массива А1 printf ("\nMassiv A1:\n");  for (i=0; i<5; i++)   printf ("%5.2f ", A1[i]);     return 0;      }

  1. Здравствуйте. Я только учусь и пользуюсь Visual Studio 2015. Почему-то у меня не получается работать в нем с переменными типа char. Вот пример с шифром Цезаря:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include "stdafx.h"   int main() {     system("chcp 1251");     system("cls");     char a[100];     int i, n;       printf("Здравствуйте, введите ваше сообщение:\n");     scanf_s("%s", a);     printf("\nВведите количество знаков для переноса:\n");     scanf_s("%d", &n);       if (n > 26)         n = n % 26;       for (i = 0; a[i] != '\0'; i++)     {         if (a[i] > (122 - n))             a[i] = a[i] + n - 26;         else             a[i] = a[i] + n;     }     printf("Зашифрованный текст: %s", a);       _getch();     return 0; }После ввода текста вылетает ошибка и открывается файл stdio.h. Код я проверял несколько раз, пробовал даже с обычным вводом/выводом одного символа, ничего не работает. Буду благодарен за помощь.

  1. Нужна помощь. Нужно написать код для сортировки строк, с клавиатуры вводится наименование города и популяция. Задача отсортировать в алфавитном порядке города. Вот сам код в СИ.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #include #include #include "struct.h"     void inputTown(struct town*pt); void printTown(struct town*pt); void sortTown(struct town*pt);   int main(int argc, char**argv) {     struct town Towns[10];       for(int i = 0; i < 10; i++){         inputTown(&Towns[i]);     }         sortTown(&Towns);         for(int i = 0; i < 10; i++){         printTown(&Towns[i]);     }       getchar();     return 0; }   void inputTown(struct town*pt) {     printf("Input netx town.\n");     printf("Name: ");     gets_s(pt->name, NAMELENGHT);       printf("Population: ");     scanf_s("%d", &pt->population);     getchar();     return; }   void printTown(struct town*pt) {     printf("town: %s, population:%d\n", pt->name, pt->population); }   void sortTown(struct town*pt) {     char tmp[80];     char*ptr = tmp;       for (int i = 0; i < NAMELENGHT - 1; i++)                     //сортировка выбором         for (int j = i; j < NAMELENGHT; j++) {             if (strcmp(pt[i].name, pt[j].name) > 0)             {                 *ptr = pt[i].name;//[80]                 int x = pt[i].population;                 strncpy_s(pt[i].name, NAMELENGHT, pt[j].name, strlen(pt[j].name));                 pt[i].population = pt[j].population;                 strncpy_s(pt[j].name, NAMELENGHT, ptr, strlen(ptr));                 pt[j].population = x;             }         } }собственно вроде ошибка где то в функции sortTown, либо может неверно аргумент отправляю в функцию. Подскажите где ошибка пожалуйста.

  1. При выполнении scanf("%f", &e) программа не реагирует на нажатие любой клавиши.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  #include #include #include   int main() {     float Fx,  ch, zn, x,e;     int i,j;     setlocale(LC_ALL, "rus");     printf("Эта программа предназначена для вычисления y(x) =ln(1+x)=x-x2/2+x3/3-...+(-1)nxn/n (0x>0): ");     scanf("%f\n", &x);     printf("Задайте точность вычисления(e>0): ");     scanf("%f", &e);     ch = 0;     zn = 0; i = -1;     j = 1;     Fx = 0;         do         {               ch = ch * x;             zn++;             Fx = Fx + j*ch / zn;             j = j*i;         } while (fabsf(ch/zn)>e);         printf("\ny(x)= %f",Fx);           _getch(); }

  1. Здравствуйте. Подскажите, в чем у меня может быть здесь ошибка (4 строчка), прошу обьяснить попроще т.к. только начинаю изучать язык Си++. Есть задачка: Вычислить сумму элементов массива, расположенных между первым и вторым отрицательными элементами.C++ (Qt)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include; #include; #include0) sum+=mas[i];             }             printf("\nsum=%d",sum);             getch();             return 0;             }

  1. Первая функция с выбором работает правильно, все остальные функции обрабатываются через ELSE. Как исправить?C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include #include   int main() {     char a;         printf("Enter a character: ");     scanf("%c",&a);           if (isdigit(a) == 1)          printf("%c is a digit.\n",a);     else          printf("%c is not a digit.\n",a);           if (isalpha(a) == 1)         printf("%c is a letter\n",a);     else         printf("%c is not a letter\n",a);           if (isalnum(a) == 1)         printf("%c is a digit or a letter\n",a);     else         printf("%c is not a digit or a letter\n",a);           if (isxdigit(a) == 1)         printf("%c is a hexandecimal\n",a);     else         printf("%c is not a hexandecimal\n",a);     return 0; }

  1. Программа меняет в квадратной матрице 4*4 местами первый и 4 столбцы. Все работает, но выводится часто "Введите элементы массива:" C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #include #include #include #define M 4 #define N 4   int main(void) {  setlocale(LC_ALL, "Russian");  int A[M][N]={0};  int K1, K2, i , j;  int temp; for (i = 0; i < 4; i = i + 1) {                              // ввод массива     for (j = 0; j < 4; j = j + 1) {         printf("Введите элементы массива: \n ");         scanf("%d", &A[i][j]);     } } for (i = 0; i < 4; i = i + 1) {                         // вывод массива         printf("\n");     for (j = 0; j < 4; j = j + 1) {         printf("%d\t",A[i][j]);     } printf("\n"); }       K1 = 1;     K2 = 4;       if (K1>=K2 || K1<1 || K2>N) {         puts("K1 or K2 incorrect!");         exit(1);     }     i = 0;     while (i < M) {         temp = A[i][K1-1];         A[i][K1-1] = A[i][K2-1];         A[i][K2-1] = temp;         ++i;     }       i = 0;     while (i < M) {         j = 0;         while (j < N)         {             printf("%i ", A[i][j]);             ++j;         }         putchar('\n');         ++i;     }     system("PAUSE");     return 0; }

  1. Как правильно инициализировать массив указателей на функции? Компилятор указывает ошибку в этой строчке после знака равно C1 void (*processGrades[4]) (int(*)[4], int, int) = (f0, f1, f2, f3);C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 #include #define STUDENTS 3 #define EXAMS 4   void f0 (const int [][EXAMS], int, int); void f1 (const int [][EXAMS], int, int); void f2 (const int [][EXAMS], int, int); void f3 (const int [][EXAMS], int, int);   int main () {     int a;     void (*processGrades[4]) (int(*)[4], int, int) = (f0, f1, f2, f3);     int studentsGrades [STUDENTS] [EXAMS] = {{77, 68, 86, 73},                                              {96, 87, 89, 78},                                              {70, 90, 86, 81}};       printf ("\n0 - massiv ocenok\n1 - min ocenka\n2 - max ocenka\n3 - sredny ocenka po vsem testam dly kagdogo studenta\n4 - viti iz programmi\n");     scanf ("%d", &a);       while (a >= 0 && a < 4)     {         (*processGrades[a])(studentsGrades, STUDENTS, EXAMS);          printf ("\n0 - massiv ocenok\n1 - min ocenka\n2 - max ocenka\n3 - sredny ocenka po vsem testam dly kagdogo studenta\n4 - viti iz programmi\n");          scanf ("%d", &a);     }     printf ("You entered 4 to end\n");     return 0; }   /* Выводит массив оценок */ void f0 (const int grades [][EXAMS], int peoplse, int tests) {  int i, j;  printf ("                [0]  [1]  [2]  [3]");    for (i = 0; i <= peoplse - 1; i++)  {     printf ("\nstudentGrades[%d] ", i);       for (j = 0; j <= tests - 1; j++)         printf("%-5d", grades[i][j]);  } } /* Выводит минимальную оценку */ void f1 (const int grades [][EXAMS], int peoplse, int tests) {     int i, j, lowGrade = 100;     for (i = 0; i <= peoplse - 1; i++)         for (j = 0; j <= tests -1; j++)             if (grades[i][j] < lowGrade)                 lowGrade = grades[i][j];             printf("Lowest grade: %d\n", lowGrade); } /* Выводит максимальную оценку */ void f2 (const int grades [][EXAMS], int peoplse, int tests) {     int i, j, highGrade = 0;     for (i = 0; i <= peoplse - 1; i++)         for (j = 0; j <= tests -1; j++)             if (grades[i][j] < highGrade)                 highGrade = grades[i][j];             printf("Highest grade: %d\n", highGrade); } /* Выводит среднюю оценку для каждого студента */ void f3 (const int grades [][EXAMS], int peoplse, int tests) {     int j, i, total = 0;     for (j = 0; j <= peoplse - 1; j++)     {         for (i = 0; i <= tests - 1; i++)             total += grades [j][i];         printf ("The average grade for students %d is %d\n", i, total);         total = 0;     } }

  1. Bash1 2 3 4 5 6 7 8 9 10 list.c: In function ‘listRemove’: list.c:116:2: warning: format ‘%g’ expects argument of type ‘double’, but argument 2 has type ‘LIST_TYPE’ [-Wformat=]   printf("Элемент z=%g%+gi удален из списка\n", list->_arr[cur]._data);//   ^ list.c:116:2: warning: format ‘%g’ expects a matching ‘double’ argument [-Wformat=] list.c: In function ‘listPrint’: list.c:147:3: warning: format ‘%g’ expects argument of type ‘double’, but argument 2 has type ‘LIST_TYPE’ [-Wformat=]    printf("%g%+gi ", list->_arr[cur]._data);    ^ list.c:147:3: warning: format ‘%g’ expects a matching ‘double’ argument [-Wformat=]Но C1 typedef double complex LIST_TYPE;C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 void listRemove(List *list, const int index) {     int prev, cur;       if (listEmpty(list))     {         printf("Список пуст\n");           return;     }     else if (index < 0 || index >= list->_size)     {         printf("Ошибка. Позиция не найдена\n");           return;     }       if (index == 0)     {         cur = list->_first;         list->_first = list->_arr[list->_first]._next;     }     else     {         prev = findPrev(list, index);         cur = list->_arr[prev]._next;         list->_arr[prev]._next = list->_arr[cur]._next;     }       printf("Элемент z=%g%+gi удален из списка\n", list->_arr[cur]._data);//       list->_arr[cur]._data = ' ';     list->_arr[cur]._next = list->_hole;     list->_hole = cur;     list->_size--; }иC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void listPrint(const List *list) {     int i, cur = list->_first;       if (listEmpty(list))     {         printf("Список пуст\n");           return;     }         for (i = 0; i < list->_size; i++)     {         printf("%g%+gi ", list->_arr[cur]._data);           cur = list->_arr[cur]._next;     }       printf("\n"); }

  1. Всем привет у меня вопрос, есть код и в нём нужно разделить 2 переменные типа float с использованием указателя. Но при делении у меня выводит значение 0.000. Что я сделал не так ? C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include #include   void Zusatz (int *a, int *b, int *c) {     *c=*a+*b; } void Subtraktion (int *a, int *b, int *c) {     *c=*a-*b; } void Multiplikation (int *a, int *b, int *c) {     *c=(*a)*(*b); } void Teilung (int *a, int *b, float *c) {     *c=(*a)/(*b); } void Exponent (int *a, int *b, int *c) {     int i;     *c = 1;       for(i = 1; i <= *b; ++i)     {         *c *= *a;     } }   int main(void) {     int a,b,c;       printf("a = ");     scanf("%d",&a);     printf("b = ");     scanf("%d",&b);       Zusatz (&a, &b, &c);     printf("\n%d", c);     Subtraktion (&a, &b, &c);     printf("\n%d", c);     Multiplikation (&a, &b, &c);     printf("\n%d", c);     Teilung (&a, &b, &c);     printf("\n%.2f", c);     Exponent (&a, &b, &c);     printf("\n%d", c);       return 0; }