Discussion:
strcat
(zu alt für eine Antwort)
t***@gmail.com
2016-02-01 16:34:12 UTC
Permalink
Raw Message
Hallo,

warum gibt es hier einen Speicherzugriffsfehler:

printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }


***@Hamlet:~/myC++/unp/snl/tcp/server$ ./test_client www.heise.de
Connected!
Speicherzugriffsfehler (Speicherabzug geschrieben)
Rainer Weikusat
2016-02-01 17:02:09 UTC
Permalink
Raw Message
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Weil 'source' bei der ersten Iteration keinen null-terminierten String
enthaelt.
Michael Welle
2016-02-02 07:13:41 UTC
Permalink
Raw Message
Hallo,
Post by Rainer Weikusat
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Weil 'source' bei der ersten Iteration keinen null-terminierten String
enthaelt.
da gibt es natuerlich noch mehr Fallen. Zeile 71 und n2==LEN z.B.

VG
hmw
Helmut Schellong
2016-02-02 10:49:58 UTC
Permalink
Raw Message
Post by Michael Welle
da gibt es natuerlich noch mehr Fallen. Zeile 71 und n2==LEN z.B.
Post by t***@gmail.com
64 char buf[LEN], source[100000];
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
Noch mehr:
Zeile 73 ist völlig kaputt.
Ist allerdings auskommentiert.

Die Basisadresse des Arrays source[] wird um den jeweiligen Wert
buf[i] erhöht, strlen-mal hintereinander.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
t***@gmail.com
2016-02-03 16:16:44 UTC
Permalink
Raw Message
Post by Helmut Schellong
Post by Michael Welle
da gibt es natuerlich noch mehr Fallen. Zeile 71 und n2==LEN z.B.
Post by t***@gmail.com
64 char buf[LEN], source[100000];
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
Zeile 73 ist völlig kaputt.
Ist allerdings auskommentiert.
Die Basisadresse des Arrays source[] wird um den jeweiligen Wert
buf[i] erhöht, strlen-mal hintereinander.
--
Mit freundlichen Grüßen
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Zeile 73 ist die C++-Variante.
Helmut Schellong
2016-02-03 21:15:44 UTC
Permalink
Raw Message
Post by t***@gmail.com
Post by Helmut Schellong
Die Basisadresse des Arrays source[] wird um den jeweiligen Wert
buf[i] erhöht, strlen-mal hintereinander.
Zeile 73 ist die C++-Variante.
Auch C++ erlaubt doch nicht solch eine Konstruktion:

char buf[LEN], source[100000];
for (uint i = 0; i < strlen(buf); i++) {
source += buf[i];
}

Das müßte so aussehen:

source[si+i] = buf[i];
}
si += i;

Auch kann strlen(buf) durch n2 ersetzt werden.
Und if (n2 == 0) continue; kann zu einem endlosen Loop führen.
Diese Zeile und if (n2 == -1) break; sind jedoch redundant, da die
while-Schleife > 0 verlangt.

strcat() führt hier zu langsamem Code, da immer wieder der
immer länger werdende String abgeklappert wird.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
t***@gmail.com
2016-02-14 16:27:50 UTC
Permalink
Raw Message
Post by t***@gmail.com
Post by t***@gmail.com
Post by Helmut Schellong
Die Basisadresse des Arrays source[] wird um den jeweiligen Wert
buf[i] erhöht, strlen-mal hintereinander.
Zeile 73 ist die C++-Variante.
char buf[LEN], source[100000];
for (uint i = 0; i < strlen(buf); i++) {
source += buf[i];
}
source[si+i] = buf[i];
}
si += i;
Aber nicht, wenn source ein std::string ist.
Post by t***@gmail.com
Auch kann strlen(buf) durch n2 ersetzt werden.
Und if (n2 == 0) continue; kann zu einem endlosen Loop führen.
Diese Zeile und if (n2 == -1) break; sind jedoch redundant, da die
while-Schleife > 0 verlangt.
strcat() führt hier zu langsamem Code, da immer wieder der
immer länger werdende String abgeklappert wird.
--
Mit freundlichen Grüßen
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
t***@gmail.com
2016-02-01 17:11:57 UTC
Permalink
Raw Message
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Connected!
Speicherzugriffsfehler (Speicherabzug geschrieben)
Meinst Du so etwas:

source[100000 + 1] = '\0';
Rainer Weikusat
2016-02-01 17:14:52 UTC
Permalink
Raw Message
Post by t***@gmail.com
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Connected!
Speicherzugriffsfehler (Speicherabzug geschrieben)
source[100000 + 1] = '\0';
Das verursacht jedenfalls keinen Speicherzugriffsfehler denn es liesse
sich gar nicht uebersetzen. Aber

*source = 0;

sollte funktionieren.
t***@gmail.com
2016-02-01 17:18:03 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Post by t***@gmail.com
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Connected!
Speicherzugriffsfehler (Speicherabzug geschrieben)
source[100000 + 1] = '\0';
Das verursacht jedenfalls keinen Speicherzugriffsfehler denn es liesse
sich gar nicht uebersetzen. Aber
*source = 0;
sollte funktionieren.
Geht nicht. Lässt sich übersetzen. Dann wieder derselbe Fehler.
t***@gmail.com
2016-02-01 17:22:08 UTC
Permalink
Raw Message
Post by t***@gmail.com
Post by Rainer Weikusat
Post by t***@gmail.com
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Connected!
Speicherzugriffsfehler (Speicherabzug geschrieben)
source[100000 + 1] = '\0';
Das verursacht jedenfalls keinen Speicherzugriffsfehler denn es liesse
sich gar nicht uebersetzen. Aber
*source = 0;
sollte funktionieren.
Geht nicht. Lässt sich übersetzen. Dann wieder derselbe Fehler.
Rainer Weikusat
2016-02-01 17:24:35 UTC
Permalink
Raw Message
Post by t***@gmail.com
Post by Rainer Weikusat
Post by t***@gmail.com
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Connected!
Speicherzugriffsfehler (Speicherabzug geschrieben)
source[100000 + 1] = '\0';
Das verursacht jedenfalls keinen Speicherzugriffsfehler denn es liesse
sich gar nicht uebersetzen. Aber
*source = 0;
sollte funktionieren.
Geht nicht. Lässt sich übersetzen. Dann wieder derselbe Fehler.
Der liegt dann in einem anderen Teil des Programms, vgl

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

static void randomize(char *b, unsigned n)
{
while (n) b[--n] = rand();
}

int main(int argc, char **argv)
{
char total[1000];

randomize(total, sizeof total); /* simulate used stack space */

*total = 0;
strcat(total, argv[1]);
strcat(total, argv[2]);

puts(total);

return 0;
}
t***@gmail.com
2016-02-01 17:29:43 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Post by t***@gmail.com
Post by Rainer Weikusat
Post by t***@gmail.com
Post by t***@gmail.com
Hallo,
printf("Connected!\n");
58
59 ssize_t n1, n2;
60 while ( (n1 = write(fd, GET0, strlen(GET0))) == -1) {
61 fprintf(stderr, "write-err: %s\n", strerror(errno));
62 }
63
64 char buf[LEN], source[100000];
65 while ( (n2 = read(fd, buf, LEN)) > 0) {
66
67 if (n2 == -1) break;
68
69 if (n2 == 0) continue;
70
71 buf[n2] = '\0';
72 // for (uint i = 0; i < strlen(buf); i++) {
73 // source += buf[i];
74 // }
75
76 strcat(source, buf);
77 }
Connected!
Speicherzugriffsfehler (Speicherabzug geschrieben)
source[100000 + 1] = '\0';
Das verursacht jedenfalls keinen Speicherzugriffsfehler denn es liesse
sich gar nicht uebersetzen. Aber
*source = 0;
sollte funktionieren.
Geht nicht. Lässt sich übersetzen. Dann wieder derselbe Fehler.
Der liegt dann in einem anderen Teil des Programms, vgl
----
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void randomize(char *b, unsigned n)
{
while (n) b[--n] = rand();
}
int main(int argc, char **argv)
{
char total[1000];
randomize(total, sizeof total); /* simulate used stack space */
*total = 0;
strcat(total, argv[1]);
strcat(total, argv[2]);
puts(total);
return 0;
}
Danke!
Loading...